此问题在此处已有答案:
How to "git show" the diffs for a merge commit?(5个答案)
10小时前关闭。
这是一个通用的git问题,但我使用开源的Linux内核源代码来更好地解释我的问题。
如果我这样做:
$ git show df57721f9a63e8a1fb9b9b2e70de4aa4c7e0cd2e
字符串
我看到了this output。请注意,这是一个合并提交,并且在执行git show
时会显示一个diff。
另一方面,如果我这样做:
$ git show 535a265d7f0dd50d8c3a4f8b4f3a452d56bd160f
型
我看到了this output。注意这也是一个合并提交,但是在执行git show
时没有显示diff。
我试着理解以下几点:
1.为什么前者显示与git show
的差异,而后者没有?是由于合并冲突解决方案吗?
1.有没有可能对df57721f9a63e8a1fb9b9b2e70de4aa4c7e0cd2e
对应的diff进行cherry-pick操作?当尝试进行cherry-pick操作时,它会要求对应于其父代之一的“-m”选项;这不是我想要做的。
2条答案
按热度按时间1szpjjfi1#
在Git中,当你对合并提交执行
git show
时,显示的差异取决于提交历史和合并过程中引入的更改。你看到或看不到的差异与合并的执行方式和结果更改有关。以下是你可能会看到两个合并提交的不同行为的原因:
显示合并提交的差异:
当
git show
显示合并提交的差异时,这通常意味着合并本身引入了更改,即正在合并的分支之间存在冲突更改。Git可以显示冲突解决或合并过程中所做更改导致的差异。合并提交不显示差异:
如果
git show
没有显示合并提交的差异,则表明合并没有引入任何额外的更改。如果合并是“快进”合并,则可能会发生这种情况。在这种情况下,Git只是移动了分支指针,而没有创建额外的合并提交,因为分支之间不存在冲突的更改。关于从合并提交中挑选特定差异:
从合并提交中挑选一个特定的diff并不简单,因为合并提交代表了来自多个分支的更改的集成。Git要求你在挑选合并提交时指定你想要挑选哪个父级的更改。当尝试挑选合并提交时,Git需要知道应用哪个父级的更改:
字符串
这里,-m 1指定第一个父级。您可能需要根据分支的合并历史记录确定适当的父级编号。
如果您对由特定分支引入到当前分支中的精选更改感兴趣,请考虑直接使用该分支的分支名称或提交散列,而不是合并提交。
请记住,从合并提交中挑选樱桃涉及选择合并的一方,理解不同分支引入的更改的上下文对于有效地挑选樱桃至关重要。
yzxexxkh2#
看看diff header:
字符串
diff --cc
。来自man git show
:[1]对于提交,它显示日志消息和文本差异。它还以
git diff-tree --cc
生成的特殊格式显示合并提交然后从
man git diff-tree
开始:这个标志改变了合并提交补丁的显示方式,类似于-c选项。它隐含了-c和-p选项,并通过省略不感兴趣的块来进一步压缩补丁输出,这些块的父对象中的内容只有两个变体,合并结果会选择其中一个而不进行修改。当所有块都不感兴趣时,提交本身和提交日志消息不会显示,就像任何其他“空差异”情况一样。
这个(树)diff变量不会显示任何可以自动合并的内容。它只显示两个父对象都有修改的区块。请参阅示例中的第一个区块:
型
请注意,这里有两个差异(请参阅单字符缩进)。这意味着块重叠并存在冲突。您可以使用以下命令重新创建冲突:
型
是否有可能选择对应于df 57721 f9 a63 e8 a1 fb 9 b 9 b2 e70 de 4aa 4c 7 e0 cd 2 e的差异?
是的。如果你选择了父代。cherry-pick是一个常规diff的应用程序,即一个单一提交与另一个单一提交的状态比较。但是上面的diff显示了代码相对于两个父代的变化。你需要(就像你说的)用
-m
选择一个父代。git(1)不会在合并中对任何父节点赋予特权,尽管我们可能经常会对第一个父节点(在本例中:Linus Torvalds的mainline(
master
))赋予特权,所以你必须明确指出是哪一个。注意事项
1.在git版本2.43.0.rc1上(我想我应该很快升级)