Git 会记录过去的合并冲突吗?

Stu*_*Stu 6 git merge merge-conflict-resolution

我想查看存储库历史记录,看看过去发生了哪些类型的合并冲突。

我试过使用,git log --merges但这似乎显示成功的合并。

Die*_*Epp 5

Git 不会记录合并冲突,除非您启用了 rerere,但它会记录重新创建它们所需的大部分信息。您可以编写一个脚本来重新创建合并冲突,但有一些注意事项... Git 不会记录您用于解决合并的合并策略,因此您必须希望默认策略是明智的选择,或者进行一些调整让它在你的回购中工作。

这个怎么运作

您可以枚举合并rev-list

git rev-list --parents --min-parents=2 --all
Run Code Online (Sandbox Code Playgroud)

这比 更可取git log,因为输出适合由脚本解析。这将生成一个合并提交列表,每行一个。子提交是第一个散列,其余散列是父项。例如,

28171e725cc93e8cb85194931e7138c31f980a43 20af81cf6388026ecf0de4eec8783e7a38905ccd 2d77896f5fcc1a9b09f4f099aa6e945e8da86410
Run Code Online (Sandbox Code Playgroud)

在这里,合并在 20af 和 2d77 之间。

在分离的头中查看第一个父级:

git checkout -q --detach 20af81cf6388026ecf0de4eec8783e7a38905ccd
Run Code Online (Sandbox Code Playgroud)

然后合并剩余的父母:

git merge -q --no-commit --no-ff 2d77896f5fcc1a9b09f4f099aa6e945e8da86410
Run Code Online (Sandbox Code Playgroud)

merge如果有冲突,状态码将为 1,您可以检查。如果存在合并冲突,您将看到UU处于瓷状态的文件:

git status --porcelain
Run Code Online (Sandbox Code Playgroud)

然后,您可以中止合并以重置为可以使用 repo 的状态:

git merge --abort
Run Code Online (Sandbox Code Playgroud)

脚本

我已经把它变成了一个脚本作为演示。该脚本必须在原始存储库上运行,因为它将运行一堆git checkoutgit merge命令。

https://gist.github.com/depp/f1838cf4559f9cde74b9d3052b8abbb0

该脚本将使用默认策略重试历史记录中的每个合并,并报告冲突文件。

如果您愿意,您可以轻松扩展脚本以复制出冲突的文件,以便您可以查看冲突。