git - rebase 破坏合并

6
我有两个独立的分支。一个月内,我在不同时间点上都对它们进行了工作。我想将其中一个分支(称为apple)合并到另一个分支(称为orange)中,所以我切换到orange分支,并执行git merge --no-ff apple,一切都很顺利。在gitk中,我可以清楚地看到每个分支有自己的历史记录,并且它们在orange上合并成一个合并提交。
后来我发现orange中的一个提交有错误,并且构建过程中出了一些问题,我需要编辑那个早期提交。我使用git rebase -i HEAD~19,选择提交并将pick更改为edit。然后我编辑提交,一切正常,并完成了重新设置基础。我返回到gitk中,所有两个分支的历史记录都变成了线性历史记录。
所以我是搞错了还是这就是正常情况?我使用git reflog回到合并之前,然后我再次重置回到orange合并之前,然后我进行了rebase并修复了该提交,最后进行了合并。现在一切看起来都是我期望的,分支的提交不会交错在一起。
请问有没有方法能够让我重新设置基础以便在合并其他分支后对其中一个分支上的提交进行变基,而不会导致提交混乱(线性历史记录)?
如果我的术语使用不正确,请随意编辑。谢谢。

我不知道 gitk,但在 gitg 中我有一个选择分支的选项,你选择了类似“所有本地分支”的东西吗? - Alvin Wong
也许可以在提交ID上进行变基,而不是相对于HEAD~19的相对位置? - nneonneo
1
请注意,git 1.8.5将引入一种保留pull --rebase合并的好方法 - VonC
@VonC 您好,感谢您的更新,我很感激。如果我再次遇到这个问题,我会记住的。 - loop
1个回答

9

这是rebase的预期行为。

它会有效地重写该分支的历史记录,从而使其(默认情况下)失去合并和其他元数据,只留下一个简化的直线分支。

您可以使用以下方式来保留合并信息:

git rebase --preserve-merges

但是在将 --preserve-merges--interactive 结合使用时,会出现一些问题。请小心处理。


1
有趣,但似乎有一个缺点:http://marc.info/?l=git&m=129382385207873 - VonC
1
我知道-i代表什么,我的意思只是想提一下,当与--preserve-merge结合使用时,它似乎不能自动解决已知的冲突。 - VonC
@VonC 或许在那种情况下使用 rerere 会有帮助?我自己没有遇到过这个问题,但是看起来确实很令人沮丧。谢谢! - willoller
1
“rerere”?但我指定的测试确切地激活了“rerere”...而他仍然必须在“rebase -i -p”上解决旧合并。因此真正的沮丧。 - VonC
@test 我不这么认为,但你可能需要再次解决那两个冲突。 - VonC
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接