改变分支基础

时间:2012-06-01 16:19:10

标签: git

我有一棵这样的树:

(commit 1) - master
                \-- (commit 2) - (commit 3) - demo
                                                \-- (commit 4) - (commit 5) - PRO

我必须将PRO分支移动到主

(commit 1) - master
                |-- (commit 2) - (commit 3) - demo
                \-- (commit 4) - (commit 5) - PRO

我在PRO分支中尝试了git rebase master,但没有任何反应。

澄清:我在大师工作,然后我不得不做一个产品演示(git checkout -b demo和一些提交)。然后,我错误地从demo(git checkout -b PRO和一些提交)创建了另一个分支,现在我需要将PRO分支移动到master并保持demo完整。最后,demo和PRO都将从master中挂起。

5 个答案:

答案 0 :(得分:162)

使用--onto

git rebase --onto newBase oldBase feature/branch

鉴于你的情况:

git checkout PRO # Just to be clear which branch to be on.
git rebase --onto master demo PRO

基本上,您将所有提交从demo提升到PRO,并将它们重新绑定到master提交。

答案 1 :(得分:12)

结帐到PRO分支,复制最旧的( commit4 )和最新的( commit5 )提交此分支的哈希并粘贴到其他位置。

$ git checkout PRO
$ git log            # see the commit history
# copy the oldest & latest commit-hash 

然后,删除PRO分支(为了安全起见,请保留备份)。从PRO创建并结帐到新的master分支。

$ git branch PRO.bac        # create a new branch PRO.bac = PRO as backup

$ git checkout master
$ git branch -D PRO         # delete the local PRO branch
$ git checkout -b PRO       # create and checkout to a new 'PRO' branch from 'master'

将( cherry-pick )上一个PRO分支的提交范围转换为新的PRO分支。

$ git cherry-pick commit4^..commit5   # cherry-pick range of commits
# note the '^' after commit4

现在,如果一切正常,那么强制(-f)推送到remote PRO分支并删除本地PRO.bac分支。

$ git log                  # check the commit history

$ git push -f origin HEAD  # replace the remote PRO by local PRO branch history
# git branch -D PRO.bac    # delete local PRO.bac branch

答案 2 :(得分:8)

我会努力做到尽善尽美。首先,请确保您在CURRENT分支上。

git checkout current-branch

然后使用以下命令 - (new-base-branch是您希望成为新基础的分支。current-base-branch是您当前基础的分支。)

git rebase --onto new-base-branch current-base-branch

如果你没有冲突,那就太好了。你完成了。如果你这样做(大多数情况下),那么请继续阅读..

可能会出现冲突,您必须手动解决冲突。 Git现在尝试进行" 3-way merge"在current-branchcurrent-base-branchnew-base-branch之间。大致这是git内部工作的方式: -

1。)Git将首先在current-base-branch之上重新定位new-base-branch。可能存在冲突;你必须手动解决。完成后,您通常会git add .git rebase --continue。它将为此创建一个新的临时提交temp-commit-hash

2。)在此之后,Git现在会在current-branch之上重新定位temp-commit-hash。可能存在进一步的冲突,您将不得不手动解决它们。完成后,您将继续使用git add .git rebase --continue,之后您已成功将current-branch重新设置为new-base-branch

注意: - 如果你开始搞砸了,那么你可以在rebase过程中随时做git rebase --abort并回到起点。

答案 3 :(得分:0)

我使用重置和存储方法略有不同,避免删除和重新创建分支以及无需切换分支:

$ git checkout PRO
$ git reset commit4 # This will set PROs HEAD to be at commit 4, and leave the modified commit 5 files in ur working index
$ git stash save -m "Commit message"
$ git reset commit 3
$ git stash save -m "Commit message"
$ git reset master --hard
$ git stash pop
$ git stash pop
$ git push --force # force if its already been push remotely

通过在提交的基础上重新提交分支,你基本上只是将一次提交分支历史记录重新编写。

答案 4 :(得分:0)

我知道这个问题很老了,但分享一下,以防它对某人有帮助。

我处于相同的情况,我从不同的基础分支提出 PR,更改基础分支和 rebase 显示 200 多个文件冲突。

即使解决它也会显示我不想要的旧提交。所以我做的是

  1. 从本地删除分支
  2. 创建同名的新分支,确保这次选择正确的基础分支
  3. 樱桃选择提交 ID,如果有的话

终于在命令下面运行了

git push origin +branchName:branchName

在上面,您也可以使用 -f 代替 +。 以上命令将我的分支置于不影响我的拉取请求的状态。