Git:为什么rebase会导致冲突,而merge不会?

min*_*ros 16 git merge rebase

我可能没有得到正确的答案,但任何人都可以向我解释为什么会git rebase导致冲突,而git merge(同一分支)却没有?

据我所知git rebase,在我在当前分支上进行的提交之前提交来自另一个分支的提交,同时git merge进行相同的提交并将它们作为补丁应用到我的分支,对吧?是diff那么不一样的,虽然也许逆转吗?不知道为什么用其他提交修补我的分支不是问题,而用我的提交修补另一个分支是.

min*_*ros 17

我看到有时我的问题仍然得到赞成。让我为那些不理解当前选择的答案的人解释一下,因为我第一次阅读时肯定没有。

假设您有一个master带有 commits 的分支AB并且C.

然后从提交C你创建一个新分支mybranch。你提交,你得到提交DE.

与此同时,其他人提交FG掌握了。

masterthen 看起来像这样:A B C F G,而mybranch看起来像这样:A B C D E

现在您有两种合并策略:

合并

在打开时mybranch,您键入git merge master。它需要master您没有的所有提交mybranch-FG。它首先合并F到您的E(最后一次提交mybranchG之上,然后合并到F.

最终结果:A B C D E F G。尽管这些字母的顺序相同,但提交并未按时间顺序完成(或可能未完成),因为实际上FG已经(或可能已经)在D和之前完成E。在这种情况下,您也会看到合并提交。

变基

在打开时mybranch,您键入git rebase master。它获取master您没有的所有提交mybranch-F并将G它们放在当前分支的顶部,使其处于当前状态master(因为您从分支开始master并现在获得master自分支以来完成的所有提交离开)。然后它接受您的第一次提交 - D- 并将其合并到G(在 上完成的最后一次提交master)。然后它将E它放在D.

最终结果:A B C F G D E。看起来好像从来没有拆分过分支master,如果 master 是一项连续的工作,因为你有点说“我希望我的分支看起来好像只是从 master 上拆分出来的,然后我的工作放在它上面” . 它相当于签出master(现在A B C F G),创建一个新分支mybranch,然后添加您的提交(A B C F G D E)。

为什么 rebase 可能会导致冲突,而合并不会。

不深入细节,我们只是说可能是 merging master's Fon the top of mybranch'sE可能不会导致冲突,但 merging mybranch's Don the top of master'sF可能。它实际上取决于更改了哪些代码,以及是否与之前的提交兼容。在这两种情况下都可能出现合并冲突。

  • 从技术上讲,在“rebase”的情况下,它不会放置确切的提交哈希值“D”和“E”,而是创建一个新的提交哈希值“D”和“E”。所以最终结果将是“ABCFG D'E”。 (4认同)

cor*_*ump 9

在rebase期间,您将某个分支的所有提交应用于另一个分支的顶部.其中一个提交可能存在您在后续提交中解决的冲突.因此,合并操作没有冲突,而rebase导致中间冲突.

另请参阅git rerere哪个允许您自动解决已解决的冲突.