在 git 中,如何避免将较小的更正合并到在原始内容的每一行之间插入一行新内容的分支中的冲突?

Posted

技术标签:

【中文标题】在 git 中,如何避免将较小的更正合并到在原始内容的每一行之间插入一行新内容的分支中的冲突?【英文标题】:In git, how can I avoid conflicts merging minor corrections into a branch where a line of new content was inserted between every line of the original? 【发布时间】:2020-08-02 09:33:55 【问题描述】:

有人用与我相似的代码询问why does a seemingly possible merge using git have conflicts,但 (1) 我的有点不同,(2) 我寻求问题的解决方案而不仅仅是解释。

编辑:这是我经常需要对许多文件执行的操作。我还需要培训非技术人员能够做到这一点。手动合并每个冲突对我的用例来说是个大问题。

master 分支上的文件开头为:

my name is dennis
i am a dolphin
i fix teeth

我创建了一个名为 analysis_1 的分支并提交了这些更改:

my name is dennis
analysis of line 1
i am a dolphin
analysis of line 2
i fix teeth
analysis of line 3

意识到我之前的错误,我检查了master 并提交了修复:

my name is dennis
i am a dentist
i fix teeth

有没有一种方法(策略、算法或 GIT_EXTERNAL_DIFF 工具)可以将 master 合并到 analysis_1 而不会发生冲突,这样我就可以像下面那样保持更正和分析?

my name is dennis
analysis of line 1
i am a dentist
analysis of line 2
i fix teeth
analysis of line 3

谢谢!

编辑 2:This question 指出 wdiff 并引导我尝试 diff 选项 --word-diff 这给了我想要的差异结果。下一步是让它用于合并。

编辑 3:似乎基于单词的合并对 SO 有一些可能会产生结果的问题。如果我在其中一个适用的解决方案中找到解决方案,我会更新这个问题。

【问题讨论】:

您将需要一个自定义合并策略,因为每个标准合并算法(不仅在 Git 中,而且我知道现有的)都会在这里发生冲突。 为什么不直接解决冲突呢?冲突不是问题,它们只是 git 询问要做什么。有冲突的合并不是不可能的合并,它只是一个你必须帮助的合并。 @bk2204:谢谢。我将研究自定义合并策略。 @matt:这只是我需要在没有人工干预的情况下大规模执行的示例。 您的示例中的问题是,当您发现问题时,master 中的“我是牙医”之类的行与 analysis1 中的任何行都没有任何明显的对应关系:否合并策略可以使用语义说“哦,这是关于我是什么”,计算机不这么认为 【参考方案1】:

问题是你试图通过添加一个提交来编辑master,该提交的工作是在analysis_1已经分支之后改变过去。这匹马已经离开了谷仓,你无能为力。

当您在analysis_1 中进行更改时然后您发现从master 带过来的一行是错误的,修复该行的位置是analysis_1,而不是master .

如果您在master 中进行此类更改,或者教其他人这样做,那是对 git 的滥用,您需要停止这样做。

【讨论】:

我不同意。主分支具有分析分支引用的源材料。分析分支用于分析工作。如果在源材料中发现错误,则源材料的分支(主)需要更新,以便其他分析分支可以受益。分析分支可能永远不会合并回主分支。这类似于对 master 进行生产错误修复(或您快速合并回 master 的错误修复分支),因此您可以保留在更正中合并到功能分支的特权。 好的,但你不同意 git,而不是我。你脑子里有一张关于差异如何工作的画面。那张照片与任何已知的现实都不对应。我只是在描述现实。 我不是在概括,我说的是您在问题中显示的数据。您无法为此更改制作和应用补丁;补丁是一个差异,master 中的这种变化不能以可以应用于 analysis_1 的方式进行差异化。你会遇到和现在一样的问题——合并冲突。这就是重点。 感谢您澄清您的观点并分享您对我的问题的看法。我很感激。

以上是关于在 git 中,如何避免将较小的更正合并到在原始内容的每一行之间插入一行新内容的分支中的冲突?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式确定如何将较小的盒子装入较大的包装中? [关闭]

将较小的 UIWebView 显示为表单

HBase 链 MapReduce 作业,将较小的表广播到所有 Mapper

Android ImageView 将较小的图像缩放到具有灵活高度的宽度,而不会裁剪或扭曲

Git 中的供应商分支

如何避免循环内的数据丢失