防止git冲突标记

时间:2018-12-13 16:20:28

标签: git git-merge merge-conflict-resolution beyondcompare git-merge-conflict

我看上去很彻底,无法找到答案,但也无法做到。有没有一种简单的方法来防止git在合并时将冲突标记附加到冲突的文件。我想防止git在文件中存在冲突时添加“ <<<< ==== -----”。

我尝试使用gitattributes“ binary”,因为我认为它不会更改文件的内容,但是没有成功。有什么想法吗?

干杯!

2 个答案:

答案 0 :(得分:1)

考虑到您的评论,您应该将“超越比较”设置为mergetool,而不是手动打开有冲突的文件。确保可以先在终端中运行bc3。然后,您可以按以下步骤进行设置(在Linux上):

git config --global merge.tool bc3
git config --global mergetool.bc3.trustExitCode true

现在,当您遇到冲突时,只需运行

git mergetool

在“超越比较”中打开有冲突的文件。

在其支持站点scootersoftware.com/support.php上查找有关其他操作系统的更多详细信息和说明。

答案 1 :(得分:0)

目标是,如果文件冲突,则

1)让git将文件标记为“存在冲突”,并且

2)能够在文件的未合并版本(“我们的”版本和“其”版本)之间使用“超越比较”。

我会提醒您,尽管这在简单情况下会很好地起作用,但它确实会破坏通常使用的三向合并方法(即,您不在考虑合并基础上下文中的更改),因此在某些更复杂的情况下,这并非易事。 (因此,我建议您熟悉一种更“标准”的解决冲突的方法,以便至少在必要时可以依靠它。)

但是肯定有几种方法可以做到这一点。最简单的方法是正常开始合并

git checkout our_branch
git merge their_branch

,然后在发生冲突时,将工作树还原为“我们的”版本

git checkout --ours path/to/conflicted/file

如果您配置了“超越比较”作为比较工具,那么您可以跳过结帐而只是

git diff our_branch their_branch -- path/to/conflicted/file

但是这里的缺点是BC不会打开文件的工作版本,因此您可能没有想要直接编辑它的支持。

因此,设置更复杂但使用起来更自动的另一种方法是设置自定义合并驱动程序。每当更改给定文件的“我们”版本和“其”版本(相对于“基本”版本)时,都会启动自定义合并驱动程序。它是一个脚本,用于接收表示文件各种版本的临时文件的名称作为参数。它将在“我们的”版本的路径上创建(临时)合并结果,并返回一个状态,该状态指示是否发生冲突。

merge属性(在https://git-scm.com/docs/gitattributes)的文档中描述了合并驱动程序。这也表明,在配置了合并驱动程序的情况下,您可以将其与给定路径下带有.gitattributes文件的文件相关联。 (您可以使用*的条目将其与存储库中的所有路径相关联,但是如果存储库中可能包含二进制文件,则可能要避免这样做,或者要确保驱动程序脚本对二进制文件的行为合理也是

脚本本身将尝试正常合并

git merge-file -p <ours> <base> <theirs> > <temp-path>

(其中<ours><base><theirs>来自脚本的参数,而<temp-path>是新的临时文件)。如果此命令返回0(无冲突),则脚本会将输出(<temp-path>)移到“我们的”版本上并返回0。否则,它将删除临时文件,使“我们的”保持不变,并返回非-零值。

现在,除了可以跳过git checkout --ours之外,这将使合并工作与第一种方法非常相似。那可能不值得。但是此解决方案的优点是,您可以在此基础上做更多的事情。

上述所有解决方案的问题是,如果文件包含任何个冲突,则该文件的所有更改(包括无冲突的更改)都不会自动合并。您必须手动处理整个文件(使用“超越比较”或其他方法)。

您可以优化合并驱动程序脚本,以便在发生冲突时使用--ours策略选项重新运行合并

git merge-file --ours <ours> <base> <theirs>

(您仍然希望先不使用--ours选项运行,以便知道是否发生任何冲突。如果存在 冲突,则删除临时文件,然后重新运行--ours选项-但没有-p或输出重定向-并再次返回非零值,因此git知道存在冲突。)

最后,请注意,如果您仅使用-s ours(完全忽略其他分支内容)或-X ours(解决了支持我们的版本的冲突,并且未报告任何冲突)。