改变分支基础

我有一棵这样的树:

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

我必须将PRO分支移动到master

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

我已经尝试了PRO分支的git rebase master,但什么都没有发生。

澄清:我在master中工作,然后我必须做一个产品演示(git checkout -b demo和一些提交)。然后,我错误地从demo (git checkout -b PRO和一些提交)创建了另一个分支,现在我需要将PRO分支移动到master,并完好无损地离开demo。最后,demo和PRO都将挂起master。

170188 次浏览

假设newBase是你想要将提交移动到的分支,oldBase是你的分支的旧基础,你可以使用--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提交。

签出到PRO分支,复制该分支最老的(commit4)和最新的(commit5)提交哈希,并粘贴到其他地方:

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

删除PRO分支(为安全起见保留备份)。从master创建并签出到一个新的PRO分支:

$ 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'

将(择优挑选) Previous PRO分支的提交范围带入新的PRO分支:

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

现在,如果一切正常,执行force (-f) push到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

我有一个稍微不同的方法,使用重置和存储,避免删除和重新创建分支,以及消除切换分支的需要:

$ 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 commit3
$ 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

通过在每次提交的基础上重置分支,你基本上只需要在每次提交时倒带该分支的历史记录。

我会尽量讲得一般一些。首先,确保你在想要的分支上:

git checkout current-branch

然后使用以下命令(其中new-base-branch是你想要作为你的新基础的分支,而current-base-branch是你的当前基础的分支。)

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

如果你们之间没有冲突,那么很好——你完蛋了。如果你知道(在大多数情况下),那么请继续读下去。

可能会出现冲突,您必须手动解决这些冲突。Git现在尝试在你的current-branchcurrent-base-branchnew-base-branch之间进行“3路合并”。git内部是这样工作的:

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

  2. 在此之后,Git将在temp-commit-hash之上重新构建你的current-branch。可能会有进一步的冲突,您必须再次手动解决它们。一旦完成,你再次继续使用git add .git rebase --continue,之后你已经成功地将你的current-branch基于new-base-branch之上。


注意:如果你开始搞砸了,那么你可以在rebase过程中的任何时候执行git rebase --abort并回到起点。

我知道这个问题很老了,但为了帮助别人,还是分享一下吧。

我在相同的条件下,我从不同的基础分支提出PR,其中改变基础分支和rebase显示200+文件冲突。

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

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

最后运行下面的命令

git push origin +branchName:branchName

在上面这里,你也可以使用-f来代替+。 以上命令将我的分支置于一个状态,而不影响我的pull请求

git branch --set-upstream-to another_branch