8

git的合并冲突解决本质上是否比其他 SCM(CVS、Subversion 等)以及独立的合并工具更有效?如果是这样,为什么?

澄清:这里我对算法本身更感兴趣——它与普通的 diff3 方法有什么不同吗?
有些工具声称在这方面更智能(例如 Guiffy),是否值得将其作为 git 合并工具插入?git 在确定文件内或文件间移动的文本方面是否更聪明?(而不是报告嘈杂的冲突。我从 Linus 的谈话中对此有一个模糊的印象)。

背景:刚刚进行了一次巨大的合并,使用git-svn它导致的冲突比我使用普通的一半svn merge(第一次合并没有跟踪)..所以我想了解原因。


它们是类似的 Qs/As,但它们更多的是关于过程的大图,以及合并如何更自然地适应。为此,git“针对合并进行优化”(而不是仅分支),实际上是否意味着:

  1. 更少的手动冲突——更好的自动解析算法(例如,重命名处理得很好)
  2. 更安全的操作——自动解决留下更多/只有真正的冲突和更少的错误警报
  3. 更快的操作——比如说,由于精益和平均对象模型
  4. 更好的工具——这使得体验不那么痛苦,例如基于 DAG 的合并跟踪、mergetool、历史查询/可视化、stash、rebase 等...
  5. 别的东西
  6. 以上的组合

? 现在,我对 1 和 2 最感兴趣。

4

2 回答 2

1

此外,这个更新的线程 (2012)详细介绍了 Git 的“自动解析”概念:

我对“自动解析”的定义:
“在合并期间,工作树文件会更新以反映合并的结果......当双方对同一文件的不同区域进行更改时,git 会自动选择双方,并且在 git 进行合并提交后,您可以确保检查这些合并结果的正确性。”

IOW,“自动解决”具体意味着双方(我们的和他们的)都对file(a)自共同祖先版本以来进行了更改file(a),并且 git 在没有引发合并冲突的情况下选择了双方。
(我想出术语“自动解析”的原因是因为在git-merge输出中,术语“自动合并”也可以表明自共同祖先以来只有一侧(他们的)发生了变化file(a),而 git 只是“快速-file(a)在共同祖先之上转发”他们的file(a)。)

Junio C Hamano在回答中提出了一个重要的观点:

  • 知道git 是愚蠢的,并且在安全方面会犯错误,将任何远程复杂的东西都放在一边;
  • 知道在同一个文件中发生的文本非冲突具有在不同文件之间发生语义冲突的相同风险,因此单出“触及同一个文件但没有冲突”任何特殊是没有意义的,但在任何一种情况下,发生这样的冲突足够小,以至于首先完成合并(和其他合并)然后检查整体结果可以更有效地利用您的时间,因为无论如何您必须至少观察一次结果,然后再将其推出。

5 年半后更新,2018 年 5 月(Git 2.18,2018 年第二季度)

git mergetools“学会了和吉菲说话

请参阅Bill Ritcher (``)的提交 6ceb658(2018 年 4 月 5 日) 。(由Junio C Hamano 合并 -- --da36be5 提交中,2018 年 4 月 25 日)
gitster

合并工具:添加对guiffy

添加guiffydifftoolmergetool

guiffy适用于 Windows、Linux 和 MacOS

于 2012-10-02T07:21:47.930 回答
1

我很想在这个答案上被证明是错误的,但是......来自 perforce......这个 git 领域有点欠发达。

  1. git 中的自动合并是不存在的。最新版本基本支持使用您的更改或其更改执行合并,仅此而已。基本上,如果您编辑文件的一部分,而其他人编辑文件的同一部分……您需要自己解决合并问题。diff3 格式可用(3 路合并),但我相信统一的 diff 格式是标准。我实际上使用 araxis 作为合并工具,并在运行“git mergetool”时将其设置为使用 3 路合并。虽然来自 perforce ......我觉得 git 在这个领域落后了。

  2. 不适用

更新回复:评论

我还没有深入了解 git 认为什么是冲突以及 p4 认为什么是冲突,但这是我在两者中所经历的。

  • Git 在进行合并时不会忽略空格……尽管将来 git 会讨论这个问题。p4 现在可以做到这一点。除非团队中的每个人都同意使用空格或制表符,并且如果您想更改文件的缩进...(例如在其他节点周围添加 xml 节点),否则不忽略空格是一个主要的痛苦,那么这很快就会变老.
  • 我觉得当我遇到文件中的合并冲突时...... git 说使用它的统一差异格式冲突的部分更大。当只有一行的一部分发生了变化时,它会将较大的部分标记为已修改,您需要直观地寻找统一差异输出的两个区域之间的变化。不过,您可以使用合并工具来解决这个问题。即使编辑同一行,p4 也能够自动解决冲突。
  • 如果您正在合并长期存在的主题分支,那么您将获得真正的享受。如果没有打开 rerere(默认情况下是关闭的),git 会忘记您已经合并了一周前发生冲突的文件,并会要求您再次合并它。p4 轻松做到这一点

我在这里的回答有点主观......但我非常想念我与 perforce 的合并。

于 2010-07-19T22:17:07.630 回答