我已经创建了一个简单的git repo来说明我的问题,可以在GitHub上找到:https://github.com/smileyborg/EvilMerge
这是回购历史的例证:
master A---B---D---E-----G-----I
\ / \ /
another_branch ----C \ /
\ /
another_branch2 F---H
Run Code Online (Sandbox Code Playgroud)
(在GitHub上的实际回购中,D是4a48c9,I是48349d.)
D是一个"简单"的邪恶合并,其中合并提交"正确"解决了合并冲突,但也产生了一个不相关的"邪恶"变化,这两个变化在父系统中都不存在.通过git show -c在此提交上使用,可以发现此合并的"邪恶"部分,因为输出包括++和--(而不是单个+和-)以指示父级中不存在的更改(请参阅上下文的答案).
I一种别样邪恶的合并,其中合并提交"正确"的解决合并冲突(从变化所引起F,以file.txt与变化相冲突G),也有"邪恶"丢弃到一个完全不同的文件中所做的更改file2.txt(有效撤消变化H).
你怎么知道这I是一个邪恶的合并?换句话说,您可以使用哪些命令来发现I不仅手动解决冲突,而且还无法合并应该具有的更改?
正如下面的RenéLink所指出的那样,很难(或许不可能)定义一套通用标准来识别"邪恶合并".然而,就像最高法院大法官斯图尔特所说的关于色情内容一样,当你看到邪恶的合并是你所知道的.
因此,或许更好的问题是:在合并提交中可以使用什么git命令来获得仅在合并提交本身中引入的所有新颖更改的diff输出.这种差异应包括:
D)I)这里的目标是能够让人类看看这个输出并知道合并是否成功或(意外或恶意)"邪恶",而 …