我创建了一个简单的 git 存储库来说明我的问题,可在 GitHub 上找到:https://github.com/smileyborg/EvilMerge https://github.com/smileyborg/EvilMerge
这是回购历史的说明:
master A---B---D---E-----G-----I
\ / \ /
another_branch ----C \ /
\ /
another_branch2 F---H
(在 GitHub 上的实际存储库中,D
is 4a48c9
, and I
is 48349d
.)
D
是一个“简单”的邪恶合并,其中合并提交“正确”解决了合并冲突,但也进行了父级中不存在的不相关的“邪恶”更改。通过使用可以发现此合并的“邪恶”部分git show -c
在此提交上,因为输出包括++
and --
(相对于单个+
and -
)来指示父级中不存在的更改(请参阅这个答案 https://stackoverflow.com/a/12615932/796419用于上下文)。
I
是一种不同类型的邪恶合并,其中合并提交“正确”解决了合并冲突(由来自F
to file.txt
与变化相冲突G
),但也“邪恶地”放弃对完全不同的文件所做的更改file2.txt
(有效地撤消来自H
).
你怎么知道I
是邪恶的合并?换句话说,您可以使用什么命令来发现I
不仅手动解决了冲突,而且还未能合并应有的更改?
编辑/更新:什么是邪恶合并?
正如所指出的雷内·林克 https://stackoverflow.com/a/27687577/796419下面,很难(也许不可能)定义一组通用标准来识别“邪恶合并”。然而,很像最高法院法官斯图尔特谈到色情内容 http://en.wikipedia.org/wiki/I_know_it_when_I_see_it,邪恶合并是一看就知道的事情。
所以也许更好的问题是:您可以在合并提交上使用哪些 git 命令来获取仅在合并提交本身中引入的所有新颖更改的差异输出。这个差异应该包括:
- 所有合并冲突解决方案(至少,如果解决方案涉及比选择一个父级的更改而不是另一个父级的更改更复杂的内容)
- 父级中不存在的所有添加或删除(如
D
)
- 父项之一中确实存在但合并提交丢弃的所有更改(如
I
)
这里的目标是能够让人查看此输出并知道合并是否成功或(意外或恶意)“邪恶”without必须重新审查所有先前审查的更改(例如F
and H
)正在合并中集成。