所有相关问题都询问将提交从主分支转移到另一个分支。
我的问题在某种程度上相反:
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重写历史记录将会发生什么在这种情况下。
答案 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)