这是我的 git 存储库历史记录的当前状态:
--o--o--o--o--o--o--o master
\
o--o--o--o--o topic2
|
topic1
我想将 topic1 和 topic2 重新设置到 master 上,并使其像:
--o--o--o--o--o--o--o master
\
o--o--o--o--o topic2
|
topic1
实现这一目标的最佳方法是什么?
最佳答案
git rebase master topic2
git branch -f topic1 HEAD~2 # On (rebased) topic2, set topic1 pointer
请注意,这假设
topic1
只是指向 topic2
过去的指针,即, topic1
上不应有任何不在 topic2
上的提交。 (HEAD~2
假定提交历史如图所示,实际上您可能想要使用特定的提交 ID。请注意,如果 topic1
甚至不存在,这也将如何工作:因为它没有“自己的”提交,指针可以随意设置即可。)编辑 :在这种情况下,您可以选择执行以下操作:
git rebase master topic1
git rebase topic1 topic2
最终结果应该与第一个选项相同(如果
topic2
包含所有 topic1
的提交!)。这种语法可能更容易理解,但如果 topic1
确实包含不在 topic2
中的提交,则解决方案会有所不同。如果是这种情况,前一种解决方案将简单地丢弃 topic1
中不在 topic2
中的任何提交,而后者会将它们 merge 到 topic2
中。这两种结果可能都是不可取的,但在我看来,第一个解决方案更清楚会发生什么,这就是我把它放在第一位的原因。为了说明,如果您的提交历史看起来像:
a1 - a2 - a3 - a4 - a5 - a6 - a7 master
\
b1 - b2 - b3 - b4 - b5 topic2
\
c1 topic1
然后第一个解决方案(
rebase
, branch
)会给你:a1 - a2 - a3 - a4 - a5 - a6 - a7 - b1' - b2' - b3' - b4' - b5' topic2
\ master \ topic1
第二个(
rebase
, rebase
):a1 - a2 - a3 - a4 - a5 - a6 - a7 - b1' - b2' - b3' - c1' - b4' - b5' topic2
\ master \ topic1
但是,在这种情况下,您可能想要得到的是:
a1 - a2 - a3 - a4 - a5 - a6 - a7 - b1' - b2' - b3' - b4' - b5' topic2
\ master \
c1' topic1
这个结果的解决方案是:
git branch tmp id_of_b3_commit # In this case id_of_b3_commit == topic1^
git rebase master tmp
git rebase tmp topic1
git rebase tmp topic2
git branch -d tmp
(如果你把它写成一个脚本,你可以使用
git merge-base topic1 topic2
找到提交的 id 放入 tmp
分支。)关于git - 如何将 2 个主题分支重新绑定(bind)到新分支上?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8665882/