git:当git没有注意到冲突时如何手动合并文件

时间:2016-02-14 05:23:12

标签: git merge

我正在开发一个协作项目,当我希望它们引发冲突并且我可以手动合并它们时,文件通常会被无冲突地合并。特别是当人们恢复变化时。

WITH product AS (
          select 1 as productId, 'A' as type
union all select 2, 'A'
union all select 3, 'A'
union all select 4, 'B'
union all select 5, 'B'
union all select 6, 'C'
)

SELECT distinct /* distinct because analytic functions don't reduce row count like aggregate functions */
  type, count(*) over (partition by type) / count(*) over ()
FROM product;

 type |         perc         
------+----------------------
 A    | 0.500000000000000000
 B    | 0.333333333333333333
 C    | 0.166666666666666667

所以D中的变化会被B中的旧东西覆盖。

有没有办法强制git合并一个特定的文件,指明它有冲突?

3 个答案:

答案 0 :(得分:2)

echo path.pattern -merge >>.gitattributes

git attributes docs

其中path.pattern与gitignore之类似。

这将避免任何解决潜在冲突的尝试,但正如David Deutsch在评论中指出的那样,如果file.txtB..C1发生了更改B..C并且C1中没有更改,则git将始终采用--no-commit版本 - git并不认为一个提示中没有任何更改,因为某些内容可能与另一个提示中存在的任何更改存在冲突。

对于那些真正存在的情况,其中重要的部分是文件没有更改,您必须使用text-indent并手动修复索引。< / p>

答案 1 :(得分:2)

在这种情况下,您可以做的一件事是将--no-commit传递给git merge,然后在提交合并之前浏览要更改的文件。但是,我建议正常合并,然后执行另一个显式提交,以恢复所需的文件。在合并过程中对文件进行不必要的更改很少是一个好主意,因为它可能会导致混乱的历史记录。例如,如果您在合并过程中“修复”了问题,那么稍后会对相关文件进行日志记录,您将看不到修复,因为记录文件历史记录通常会跳过合并。请注意,无论使用哪种方法,如果您的分支被合并回另一个分支,那么其他分支也将具有“修复”。

话虽如此,似乎这里存在更深层次的问题。如果某人还原B,我认为他们出于某种原因这样做,并且C1中的更改取决于此。所以你真的想在C1合并而不合并他们的回复吗?或者是恢复错误,在这种情况下你需要教育那些做这件事的开发人员停止做这些事情?

答案 2 :(得分:1)

  

有没有办法强制git合并一个特定的文件,指明它有冲突?

<强>都能跟得上即可。

Git跟踪更改,一旦git没有&#34;识别&#34;改变你不会发生冲突。

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

如果你想知道git如何计算diff读取这个:
What is the diff version git use? diff2 or diff3?