为什么同样的冲突再次出现,当我使用git重订?

问题描述 投票:33回答:1

我看了一下git的合并和git SO变基上相关的问题,但我还不能完全理解什么是引擎盖下发生。

这里是我们的分支的情况:

MASTER------------------------
        \        \
         \        \----Feature B---
          \                        \
           \-----Feature A----------\---Feature A+B

我们必须从主茎在不同的时间,现在我们要在2个分支合并2个功能分支。我们要遵循first rebase then merge的做法,但是,当我们重订特点A到要素B,我们得到的冲突。这是预期的,因为这两个功能(主动)在同一个领域的变化。但是奇怪的是,同样的冲突不断git rebase --continue后重新出现。这驱使我们疯了,所以我们最终放弃了底垫,并用git merge。原来,冲突实际上是很容易解决。

我的问题是双重的:

  1. git rebase适合你的情况?或者只重订好了在几分钟(1或2)的变化拉动?
  2. 那是什么导致相同的冲突一再重现引擎盖下发生?我的理解是rebase化解矛盾每次一个,但通过比较其承诺是什么?

上SO相关文章:

git merge git-merge git-rebase
1个回答
46
投票

Is rebase suitable for your situation?

基于这样的事实,Feature AFeature B似乎共享分支,我说没有。

垫底是合并分支机构,而不必合并提交(即有两个或更多的家长即提交)使其显示为一个线性的历史的一种方式。它最适合用来合并地方分支机构,即分公司,仅在本地资源库中,并没有被发布到其他人。为什么?因为至少有两个原因:

  1. 垫底改变提交的ID(即,它们的元数据的散列SHA-1)。这意味着,一旦你推衍合的提交到共享的分支,他们将出现全新提交给任何人获取他们在当地的回购协议,即使他们仍然包含相同的变化。现在,如果有人在旧的在此期间的顶部增加了新的提交,他们将不得不移动它们。这就造成不必要的混乱。
  2. 当您合并公共分支你经常想拥有那些合并,以承诺能够跟踪如何犯下跨越分支移动。这些信息将失去与垫底。

What's happening under the hood?

只是一个普通的合并。不同的是,git rebase在合并的前一个从公共父开始的顶部一次一个承诺。 git merge合并两次提交 - 与他们所做的所有修改 - 作为一个单一的操作,所以你只需要一次解决冲突。

Update: Resolving recurring conflicts

作为@Jubobs在评论中指出,Git的确实有解决发生多次冲突的自动化解决方案:git rerere,或“再利用记录的决议”。

当您在您的配置文件(rerere.enabled true)每一个合并冲突发生时使rerere,Git会记录下冲突的文件的状态之前和之后,你将它们合并。下一次出现相同的冲突 - 对参与合并的双方完全相同的线路冲突 - Git会自动为它以前记录相同的分辨率。它也将让你在合并输出知道这一点:

冲突(含量):合并冲突“somefile” 解决“somefile”使用先前的分辨率。

在这里,你可以找到more details如何处理使用git rerere冲突。

© www.soinside.com 2019 - 2024. All rights reserved.