重新计算合并冲突(即如何生成冲突标记)
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.OURS
或 f.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 mergetool
和 git merge-file
,可能会得到你想要的。
考虑 diff3 风格
您的情况(代码格式)可能不适合这种情况,但我发现将 merge.conflictStyle
设置为 diff3
可以更容易地遵循 cherry-pick 冲突。如果由于缺少合并基础上下文而导致无法读取的冲突,这种 diff3
样式会有很大帮助。如果您不喜欢全局使用它,或者只想在一个冲突中使用它,git checkout -m
(旧方法)和 git restore -m
(新方法)都可以与 --conflict=diff3
一起使用。 (--conflict
部分暗示了 -m
部分,所以你可以只使用 --conflict
选项,或者如果你有那种习惯,你可以同时使用这两个选项,因为我来自古代 Git 1.6 天。)
我有一个合并冲突,其中大多数冲突是由于代码格式引起的。
我的代码有
<<<
===
>>>
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.OURS
或 f.py.LOCAL
,以帮助跟踪哪个是哪个,尽管“ours/theirs” “local/remote " 区别因 git rebase
而分崩离析;你可以在这里使用任何你喜欢的名字——并且对每个名字做任何你想做的事情。然后使用git merge-file
:它将用合并结果覆盖第一个命名的文件。
1如果没有可能的冲突,Git根本不需要做任何这些: Git 计算出哪个文件将是三路合并的结果并直接将其放置到位。如果 是 可能的冲突,Git 会提取所有三个文件并合并它们。如果您有定义的合并 驱动程序 ,Git 将使用您的合并驱动程序。否则 Git 将使用内置的合并驱动程序,该驱动程序使用与 git merge-file
.
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
需要的三个输入文件,然后 运行 在这些文件上选择一些合并工具——任何你喜欢的程序。您可以使用它来取得良好效果。我没有对此进行过实验,但请参阅 git mergetool
命令,然后使用 git mergetool
和 git merge-file
,可能会得到你想要的。
考虑 diff3 风格
您的情况(代码格式)可能不适合这种情况,但我发现将 merge.conflictStyle
设置为 diff3
可以更容易地遵循 cherry-pick 冲突。如果由于缺少合并基础上下文而导致无法读取的冲突,这种 diff3
样式会有很大帮助。如果您不喜欢全局使用它,或者只想在一个冲突中使用它,git checkout -m
(旧方法)和 git restore -m
(新方法)都可以与 --conflict=diff3
一起使用。 (--conflict
部分暗示了 -m
部分,所以你可以只使用 --conflict
选项,或者如果你有那种习惯,你可以同时使用这两个选项,因为我来自古代 Git 1.6 天。)