Git - 在主分支的顶部移动另一个分支的最后一次提交

时间:2014-03-04 15:40:17

标签: git merge

所有相关问题都询问将提交从主分支转移到另一个分支。

我的问题在某种程度上相反:

M(n)-M(n+1)-M(n+2)-M(n+3)
\
B(1)-B(2)-B(3)-B(4)-B(5)

考虑M代表master上的提交,B代表辅助分支上的提交。 parantheses的内容是索引。

我想合并分支并在主分支的顶部移动B(5),因此在M(n+3)之后,忽略从M(n)M(n+3)所做的任何更改。< / p>

我正在避免使用git rebase,因为我的仓库的结构与共享仓库的结构相同,我不知道如果我用{{1重写历史记录将会发生什么在这种情况下。

3 个答案:

答案 0 :(得分:0)

尝试这一系列的git命令:

 git checkout M
 git reset --hard HEAD~3
 git merge B

答案 1 :(得分:0)

如果您的提交被推送到远程存储库,那么您不能只是移动它。如果分支M上的提交只是本地的,那么你可以回滚到M(n)并将分支B合并到它,这将得到你想要的。

但是,如果提交已被推送,则应避免这种情况,因为您已重写历史记录并且必须执行git push -f。如果其他人已经撤消了更改,那么它将导致很多问题。在这种情况下,您需要将更改从M(n + 1)还原为M(n + 3)。

使用这个答案: https://stackoverflow.com/a/1470452/498699

git revert --no-commit M(n+3)
git revert --no-commit M(n+2)
git revert --no-commit M(n+1)
git commit

现在您可以合并分支B并正确应用更改,并且其他任何已撤消更改的人都不会有任何困难来提取您的更改。

答案 2 :(得分:0)

如果您只想在M(n + 3)之后立即拥有B(5)(并且没有B(1)至B(4)) 然后你可以运行

git checkout master
git cherry-pick B(5)

如果你想在M(n + 3)之后所有的B(1)到B(5),但又不想改变B的历史,不用担心,只需创建一个新的C分支。

git checkout -b C_branch B_branch
git rebase --onto master `git merge-base C_branch master` C_branch

那会给出

M(n)-M(n+1)-M(n+2)-M(n+3)
\                        \
B(1)-B(2)-B(3)-B(4)-B(5)  C(1)-C(2)-C(3)-C(4)-C(5)