重新计算合并冲突(即如何生成冲突标记)

Recalculate merge conflicts (ie. how to generate conflict markers)

我有一个合并冲突,其中大多数冲突是由于代码格式引起的。

我的代码有

<<<
===
>>>

git 插入的标记,以帮助我解决冲突。

在这种状态下,我想重新格式化要应用的提交对应的代码,然后重新计算合并冲突并重新插入标记,我想冲突会更容易看。

如果重要,这是变基的一部分。

我想像在要应用的提交处检查冲突文件,重新格式化,然后“重新计算冲突”,解决冲突,然后 git rebase --continue

这可能或相关的可能吗?

I imagine something like checkout the conflicting file at the commit to be applied, reformat it, then "recalculate conflicts", resolve the conflicts, then git rebase --continue

Is this possible

不直接,不,但是:

or something related possible?

与某物相关的部分可能的。诀窍是使用git merge-file,要使用 git merge-file,你需要三个输入文件.

为了具体起见,我们称文件为f.py。也就是说,您已经启动了变基并与 f.py 发生冲突。你想要 运行:

git checkout --theirs f.py

获取您的版本,或者:

git checkout --ours f.py

将目前为止的版本放入您的工作树中。然后你想编辑这个,并尝试将它与另一个合并。

Git最初使用的三个输入文件是:

  • f.py 合并基础 提交中的副本;
  • --ours 提交中 f.py 的副本(以上两个之一);和
  • --theirs 提交中 f.py 的副本(以上两个中的另一个)。

Git 然后,默认情况下,在这种情况下,1 运行s 这三个文件通过 git merge-file 就好像通过:

git show :1:f.py > f.py.BASE
git checkout --ours f.py         # or git show :2:f.py > f.py
git show :3:f.py > f.py.REMOTE
git merge-file f.py f.py.BASE f.py.REMOTE
rm f.py.BASE f.py.REMOTE

或多或少。2

您也可以自己做同样的动作。提取所有三个文件——例如,您可以调用中间的 f.py.OURSf.py.LOCAL,以帮助跟踪哪个是哪个,尽管“ours/theirs” “local/remote " 区别因 git rebase 而分崩离析;你可以在这里使用任何你喜欢的名字——并且对每个名字做任何你想做的事情。然后使用git merge-file:它将用合并结果覆盖第一个命名的文件。


1如果没有可能的冲突,Git根本不需要做任何这些: Git 计算出哪个文件将是三路合并的结果并直接将其放置到位。如果 可能的冲突,Git 会提取所有三个文件并合并它们。如果您有定义的合并 驱动程序 ,Git 将使用您的合并驱动程序。否则 Git 将使用内置的合并驱动程序,该驱动程序使用与 git merge-file.

相同的 code

2“或多或少”的部分是因为这些文件具有仔细不冲突的临时名称,例如 .gittmp0133145a 或其他名称,即使在使用您的自己的合并驱动程序。在内部进行合并时,Git 通常根本不需要任何临时文件。对于您想做的事情,您可能需要弥补一些临时文件名。


git checkout -m

请注意,上述不同于使用 git checkout -m <em>path</em>,它只是重新创建原始合并特定文件中的冲突。也就是说,在 f.py 中发生合并冲突后,您可能 运行:

vim f.py

并对其进行(并写出)一些更改以试图解决冲突,然后意识到您刚才所做的是完全错误的。要将文件恢复到 Git 最初的状态(恢复原始合并冲突),您可以 运行:

git checkout -m f.py

或(自 Git 2.23 起)git restore -m f.py 取回在编辑器中覆盖之前的 f.py

您还可以使用:

git restore --conflict=diff3 f.py

(或类似 git checkout);见下文。

使用 git mergetool

构建您想要的内容

git mergetool 命令提取 git merge-file 需要的三个输入文件,然后 运行 在这些文件上选择一些合并工具——任何你喜欢的程序。您可以使用它来取得良好效果。我没有对此进行过实验,但请参阅 on to 。对有问题的文件的当前工作树副本进行一些谨慎的预 git mergetool 命令,然后使用 git mergetoolgit merge-file,可能会得到你想要的。

考虑 diff3 风格

您的情况(代码格式)可能不适合这种情况,但我发现将 merge.conflictStyle 设置为 diff3 可以更容易地遵循 cherry-pick 冲突。如果由于缺少合并基础上下文而导致无法读取的冲突,这种 diff3 样式会有很大帮助。如果您不喜欢全局使用它,或者只想在一个冲突中使用它,git checkout -m(旧方法)和 git restore -m(新方法)都可以与 --conflict=diff3 一起使用。 (--conflict 部分暗示了 -m 部分,所以你可以只使用 --conflict 选项,或者如果你有那种习惯,你可以同时使用这两个选项,因为我来自古代 Git 1.6 天。)