Git如何决定冲突?

时间:2013-07-15 14:17:40

标签: git merge-conflict-resolution

当我从团队中的其他人修改某个文件时从GitHub撤出时,Git命令显示存在Git无法解决的未解决冲突。我打开Perforce或Visual Studio 2012来修复冲突,图形工具显示我没有冲突并快速执行合并。

Git是否有一个独立于你的set mergetool / difftool的内部冲突检测/合并工具?

或者它是否使用您配置的工具自动合并并检测无法解决的冲突?

我的情况很奇怪,Git表示它无法自动启动但图形工具没有显示任何问题。

3 个答案:

答案 0 :(得分:12)

Git有一个独立于difftool的内部合并系统。无论如何,您可以使用手册中的merge strategy选项指定-s

-s <strategy>
--strategy=<strategy>
  

使用给定的合并策略;可以多次提供,以按照应该尝试的顺序指定它们。如果没有-s   选项,使用内置的策略列表(git   合并单个头时的merge-recursive,git merge-octopus   否则)。

当合并很多树时,策略从简单的FastForward变为Octopus。 请查看此asnwer,了解不同merge策略的工作原理。

无论如何,你的情景很奇怪。也许你的IDE正在使用不同的合并策略,所以当它打开时它会以正确的方式合并。

答案 1 :(得分:2)

是的,许多IDE和合并工具都会在git自己的基础上进行自动冲突解决。

git help merge-file所示,git的文本文件冲突解决算法非常简单:如果更改相邻行,则会发生差异冲突。如果git无法以这种方式自动解决冲突,它会将文本冲突标记放在自RCS日以来一直标准的格式中,并且IDE可以接收并处理(即使它没有了解git):

<<<<<<<< Version identifier 1
Foo
=======
Bar
>>>>>>>> Version identifier 2

我不使用Visual Studio,但快速Google告诉我它有automatic conflict resolution功能。 (我自己使用kdiff3,它有its own自动冲突解决算法)

答案 2 :(得分:1)

发布here是我在git merge策略中看到的最佳答案。是的,您可以使用-s option

选择所需的一个

但你问的是,为什么像Visual Studio这样的其他工具在git无法合并时为什么呢? Visual Studio可以采用相当积极的合并策略 - “自动合并功能通常不会使用旧版本中的任何内容,因为自动合并功能的默认设置支持最新文件”有关详细信息,请参阅here

要了解有关VS 2012附带的合并工具的更多信息,请参阅this posting,其中Brian Harry深入研究了他们将“合并时的最小冲突”视为关键功能的方式。

至于Perforce,我怀疑它们有类似的合并策略 - git到p4连接器必须使用perforce合并策略来弄清楚,我相信它们也更具攻击性。

“我们的”可能是git中类似的激进合并策略。

但长期和短期的是,每个产品都使用自己的合并策略,有些产品或多或少具有攻击性。这取决于您的用例和可接受的需求。