如何总结合并来检测错误的`git merge -s our`?

Mar*_*oth 23 git git-diff git-merge

过去几次,我们遇到了一个问题,即开发人员(明确地或有效地)完成了git merge -s ours他们不应该做的事情,提交已经丢失,而且我们只是在清理工作更加复杂和时间之后才检测到这个问题.耗时.测试没有失败,因为添加测试的提交被静默地还原了他们正在测试的代码.

我想要做的是找到或创建一个总结合并的工具,通过正常合并生成类似下面的输出:

Lines              Left(2b3c4d) Right(3c4d5e)
Common with base   970          930
Unique wrt base    20            50
Unique wrt other   15            45
Unique wrt merge   15            45
Common with merge  995          985
Run Code Online (Sandbox Code Playgroud)

但是,如果合并不正确,还原了许多更改,或者git merge -s ours执行了某些更改,则可能会生成如下报告:

Lines              Left(2b3c4d) Right(3c4d5e)
Common with base   970          930
Unique wrt base    20            50
Unique wrt other   15            45
Unique wrt merge   15             0 !!
Common with merge  990          935
Warning: 100% of changes from 3c4d5e are missing from merge commit!
Run Code Online (Sandbox Code Playgroud)

如果这个报告是针对每次提交运行的,那么只要合并有点臭的话,我们就可以标记(通过jenkins工作).

到目前为止,我一直在玩git diff --stat, git diff --name-statusgit diff --summary但至今没有给我我想要什么比较.

到目前为止我能做的最好的事情会导致正常合并的类似内容:

              base..left   base..right  left..merge  right..merge
              f67c4..a9eb4 f67c4..5b592 a9eb4..cb209 5b592..cb209
 a    |                    1 +          1 +          
 b    |       1 +                                    1 +
 base |       1 +          1 +          1 +          1 +
changed       2            2            2            2
insertions(+) 2            2            2            2
deletions(-)  0            0            0            0
Run Code Online (Sandbox Code Playgroud)

ours合并:

              base..left   base..right  left..merge  right..merge
              f67c4..a9eb4 f67c4..5b592 a9eb4..95637 5b592..95637
 a    |                    1 +                       1 -
 b    |       1 +                                    1 +
 base |       1 +          1 +                       2 +-
changed       2            2            0            3
insertions(+) 2            2            0            2
deletions(-)  0            0            0            2
Run Code Online (Sandbox Code Playgroud)

请注意,我不仅想要检测-s ours合并,我还想了解一些但不是所有更改都在合并中的情况.这是检测错误合并的一般情况,而不仅仅是检查丢失更改的一个特定原因.

此外,这似乎只在合并中存在冲突时发生,因此任何需要自动再次运行合并的方法也需要自动解决这些冲突.

最后,我希望能够在脏回购中运行此摘要实用程序,而不首先隐藏我的所有更改,因此我目前的实验git diff.

任何有关如何比具有大量解析和重新格式化的脚本更直接地获取此类信息的建议将不胜感激.

我能找到的最接近的现有问题是:检测'-s our'所做的合并(但唯一的答案没有帮助)和"git merge -s ours"以及如何显示差异(但没有那里的答案).

Dav*_*sch 1

我遇到了这个确切的问题,并最终编写了一个工具来检测这些类型的合并。虽然我无法共享实际的代码(从技术上讲,它由我的雇主拥有),但算法非常简单:让 S1 为在合并和合并的第二个父级之间发生更改的所有文件的集合。令 S2 为在合并和合并基础之间发生更改的所有文件的集合。从 S1 中减去 S2,您将得到一组可能因合并而丢失更改的文件。

这不仅会检测使用 进行的合并-s ours,还会检测拙劣的合并,其中第二个父级中的一些(但不是全部)更改已进入合并。