Git: 当Git没有检测到冲突时,如何手动合并文件

3

我正在参与一个协作项目,经常会出现文件合并时没有冲突而是自动合并了,但我希望能够手动合并。特别是在有人撤销更改时。

       B1 ------C1
      /            \
A --- B  --- C ---- D -- 

当 D 中的更改被来自 B 的旧内容覆盖时,您希望知道是否有一种方法可以强制 git 合并特定文件并指定它存在冲突?


2
顺便说一句,即使没有冲突,你仍然想停止自动合并,可以先审查更改,然后合并,你可以使用 git merge <HASH> --no-commit --no-ff。这将允许您验证更改,然后手动提交。 - Royal Pinto
3个回答

2
是的。
echo path.pattern -merge >>.gitattributes

Git属性文档

其中路径模式与.gitignore等相同。

这将避免尝试解决潜在的冲突,但正如David Deutsch在评论中指出的那样,如果file.txtB..C1中发生了更改,并且在B..C中未更改,则git将始终采用C1版本——git不认为一个端点中没有任何更改应被视为可能与另一个中存在的任何更改冲突的事情。

对于像这样真正离奇的情况,其中重要部分是文件更改,您必须使用--no-commit并手动修复索引。


请注意,您需要使用>>;单个>将覆盖文件的整个内容。 - David Deutsch
此外,看起来只有在B..C中文件被更改过才能起作用;否则它只会被分支的副本覆盖。 - David Deutsch
-merge- 部分是您选择的路径模式(例如 *)的该属性的 unset,表示不要合并此类型的路径 - 请参见 git help attributes 文档中 binary 宏的示例定义。此外,这导致三方合并语义为“将当前分支的版本作为暂定合并结果,并声明合并存在冲突。这适用于没有明确定义的二进制文件合并语义。” - Philip Oakley
@DavidDeutsch 感谢您的 >> 应用,并指出 git 不认为没有任何更改存在可能与当前存在的更改产生冲突。 - jthill

2
在这种情况下,你可以在git merge命令中传递--no-commit参数,然后在提交合并之前检查要更改的文件。但是,我建议正常合并,然后再进行另一个显式提交以恢复所需的文件。在合并过程中对文件进行不必要的更改很少是一个好主意,因为它可能导致混乱的历史记录。例如,如果你在合并过程中“修复”了问题,然后稍后对相关文件进行日志记录,你将看不到修复记录,因为文件历史记录通常会跳过合并操作。请注意,无论采用哪种方法,如果你的分支最终被合并回其他分支,那么其他分支也将具有相同的“修复”。
话虽如此,似乎存在更深层次的问题。如果某人撤销了B,我认为他们这样做是有原因的,并且他们在C1中所做的更改依赖于此。因此,在没有合并撤销的情况下合并C1,你真的想这样吗?或者撤销是一个错误,你需要教育做出这种行为的开发人员停止这样做吗?

1

有没有一种方式可以强制git合并指定文件,同时指定它具有冲突?

没有。

Git跟踪更改,一旦Git不“识别”更改,您将不会得到冲突。

Git使用启发式算法https://www.kernel.org/pub/software/scm/git/docs/technical/pack-heuristics.txt来跟踪更改。因此,除非存在真正的冲突(例如:相同行的更改),否则就不会有冲突。

如果您想了解Git如何计算差异,请阅读以下内容:
Git使用哪个diff版本? diff2还是diff3?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接