我们的开发流程规定每个开发人员都应该先将他/她的主题分支变基为 master,然后将其与--no-ff
标志合并,以创建合并气泡。这会产生一个漂亮且易于遵循的历史图表。但是,有时开发人员会不小心通过 GitHub 用户界面而不是通过 Git CLI 合并他们的拉取请求,Git CLI 在实际合并之前不会变基,从而导致以下“混乱”的历史图表:
* G
|\
| * F
|/
* E Merge pull request #123 from feature-three
|\
| * D
* | C
|\ \
| |/
|/|
| * B
|/
* A
|\
| * ...
|/
* ...
...
如果遵循该过程,我们将看到以下历史图表:
* G
|\
| * F
|/
* E' Merge branch 'feature-three'
|\
| * D
|/
* C'
|\
| * B
|/
* A
|\
| * ...
|/
* ...
...
(我正在更改提交E
并C
进行'
初始化,因为它们会有不同的哈希值)
我们需要以编程方式获取此类损坏的合并提交的列表,例如E
.
git rev-list --merges --format='%h %p' A..G | grep -v '^commit'
产生以下输出:
G E F
E C D
C A B
第一列代表合并提交,第二列是第一个父级(也是合并提交),第三列是第二个父级 - 来自主题分支的提交。但是,损坏的合并的父关系似乎没问题 - 该命令在固定的 Git 历史记录(第二张图)上运行时给出相同的输出,因此我们无法识别它。
必须有另一种方法来检测项目中损坏的合并提交。请注意,不需要git
在历史记录中的每个提交上执行的解决方案,因为某些项目有 50k+ 提交,并且单次git
执行需要超过 2 秒。