解决有利于我们或他们的 git 合并冲突,而不需要从任何一方获取整个文件

Shi*_*ami 3 git version-control

关于如何解决有利于一个或另一个分支的合并冲突的 SO 有很多问题。但我找到的最常见的答案是使用git checkout --oursor git checkout --theirs

问题是将从任一分支git checkout获取整个文件。文件的某些部分可能合并得很好,我们不希望它们被删除。

所以问题是:给定一个处于冲突状态的文件,是否有一种方法可以删除冲突标记以支持“我们的”或“他们的”,而无需将此策略应用于整个合并或从“我们的”中获取整个文件或“他们的”?

使用简单的脚本绝对可以做到这一点,但我想知道是否有我找不到的现有解决方案。

jth*_*ill 5

如果您想将文件中所有剩余的冲突解决到我们或他们的文件中,那么sed您想要的每一方和您的冲突风格都是直接的。

对于大多数代码文件,冲突标记是如此陌生,以至于您不必小心识别它们,只需键入它就很容易:

sed -si '/^<<</,/^>>>/ {/^<<</,/^===/d;/^>>>/d}'  thefile  # keep theirs
sed -si '/^<<</,/^>>>/ {/^<<</d;/^===/,/^>>>/d}'  thefile  # keep ours
Run Code Online (Sandbox Code Playgroud)

并为所有事情做到这一点,

sed -si $yourpattern $(git ls-files -m | uniq)
Run Code Online (Sandbox Code Playgroud)

最简单。

为了更加小心您的冲突标记,最好制作您提到的简单脚本,并且 diff3 冲突报告样式也需要一些更改。通常的冲突符号计数是 7,为了最好的安全,让你的 sed range /^<<<<<<< ours$/,/^>>>>>>> theirs$/,并且 diff3 报告“保留我们的”删除范围以^||||||| base$,而不是^=======$

编辑:sed在 Mac 上已被屠杀拒绝在不创建备份文件的情况下进行内联编辑,您必须执行 eg-si.bak然后删除备份。