【发布时间】:2014-09-04 05:31:54
【问题描述】:
git 如何确切确定行之间存在冲突?遵循哪些规则来确定哪些类型的差异构成冲突以及哪些可以安全合并?
举一个特定的例子,假设我们有两个csv 文件。 git 什么时候会得出结论,不能自动合并共享记录(即行)的两个 csv 文件?
例如,假设两个 csv 包含相同的公共记录集,但其中一个是添加条目,这会导致冲突吗?
【问题讨论】:
git 如何确切确定行之间存在冲突?遵循哪些规则来确定哪些类型的差异构成冲突以及哪些可以安全合并?
举一个特定的例子,假设我们有两个csv 文件。 git 什么时候会得出结论,不能自动合并共享记录(即行)的两个 csv 文件?
例如,假设两个 csv 包含相同的公共记录集,但其中一个是添加条目,这会导致冲突吗?
【问题讨论】:
这取决于用于 diff 的工具。 通常比较行。如果更改了一行 在一个修订版上,同一行在另一个修订版上被修改,如果您尝试合并它们,您将遇到冲突。
diffis based on solving the longest common subsequence problem.
diff 不知道某行已被修改。它知道一条线(或多条线)被删除并且
在文件的两个相同部分之间插入了另一个(或多个)。
修订版 A:
a b c
d e f
g h i
修订版 B:
a b c
d e a f
g h i
$ diff A B
将输出该行 d e f 被删除
并且在文件 B 中插入了行 d e a f
与相同的文件 A 相比
行a b c 和g h i。
如果文件A被修改为C:
a b c
c
d e b f
g h i
差异将输出同一行已被删除,
但是插入了行c 和d e b f。
合并B和C,冲突不会只有
d e a f
====
d e b f
但是
d e a f
====
c
d e b f
因此,简而言之,diff 会搜索相同的行块。 如果在两个文件的这些块之间修改了文件(以及修改 不完全相同),会有冲突。
【讨论】:
git(或 GNU diff 或 opendiff)怎么知道它是 same 行?
diff(例如GNU diff)如何确定两行有足够的共同内容成为同一行?
如果您不喜欢 git 处理冲突的方式,您实际上可以使用自己的插件来处理冲突。
但是,请查看此页面了解更多信息:http://en.wikipedia.org/wiki/Merge_%28revision_control%29#Three-way_merge
【讨论】: