如何在多个文件中解决相同的合并冲突?

6

假设我在200个文件中遇到了这个冲突:

<<<<<<< HEAD
/*  Version         1.0.0       */
/*  Date            2017-05-30  */
=======
/*  Version         1.0.1       */
/*  Date            2018-11-30  */
>>>>>>> release/1.0.1

我确定我要在所有文件中使用1.0.1版本。但是简单地为所有文件使用--theirs不可行,因为我还有其他修改需要从--ours保留。

有没有一种方法只使用--theirs解决这个冲突,然后手动解决其他冲突(仅在少量文件中)?


1
这对我来说似乎是非常糟糕的设计。为什么版本号应该出现在每个源文件中?如果只有少数文件,您可以使用正则表达式来清理此特定冲突。 - Tim Biegeleisen
当我们几年前从CVS转换到Git时,我尝试解决了同样的问题。花了一段时间,但最终我接受了版本和日期块实际上不属于源文件的事实。我有一个RELEASES文件,记录版本历史,但对于源文件,我将其全部删除,并依赖Git来跟踪。这样就少了很多麻烦! - joanis
@TimBiegeleisen 我曾在多家公司工作,这些公司都强制要求每个源文件都有一个拜占庭式的“标准”头部,这表明他们对“版本控制系统”一词的理解不足。 - Andy Brown
@AndyBrown 我相信这一点。我也曾在这样的环境中工作过,见过类似的事情。 - Tim Biegeleisen
1个回答

2
我能想到的让git在冲突解决时做你要求的事情的唯一方法就是编写一个自定义合并驱动程序,在调用正常的merge-file过程之前检测和“修复”版本信息。这是可行的,但需要进行一些设置(请参见git属性文档下的merge属性,其中讨论了自定义合并驱动程序)。
如果您可以容忍额外的步骤,可能更容易的方法是编写一个脚本(像perl或甚至awk这样的东西非常适合这个任务),找到并修复特定的冲突块,并在手动解决剩余更改之前运行该脚本以处理冲突合并输出。这种方法最大的缺点 - 也是我考虑使用合并驱动程序的原因 - 是如果文件仅由于版本块而发生冲突,则您将没有手动工作,但文件仍处于冲突状态 - 因此您必须检查每个文件以查看是否还有未解决的冲突。
对我来说,似乎值得重新审视导致您期望出现这些冲突的工作流程方面。

我没有测试过这个,但是 git rerere 基于单独的 diff hunks(类似于 git patch-id),因此可能也能完成工作。 - torek
@torek - 我考虑过这个问题,但我不确定。(我的rerere知识一般,因为我倾向于避免它的主要用例。)我认为我的第一个问题是冲突是否真正可重复,以至于rerere可以理解。听起来在一个特定的合并中,许多文件中出现了类似(甚至相同)的冲突块,但下一个合并中所有这些文件都会有稍微不同的冲突-所以不确定如何处理。 - Mark Adelsberger
我也不确定 - 我认为这种工作方式是合并停止,您将手动解决一个案例,手动调用git rerere记录该解决方案,并再次手动调用git rerere来对剩余的未合并文件使用记录。但显然我没有尝试过 - 而且我认为最好停止在版本控制系统中做傻事... - torek
谢谢。提前修复脚本冲突了! - eckes

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