`git show`:不同类型的合并提交[重复]

xriantvc  于 12个月前  发布在  Git
关注(0)|答案(2)|浏览(128)

此问题在此处已有答案

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”选项;这不是我想要做的。

1szpjjfi

1szpjjfi1#

在Git中,当你对合并提交执行git show时,显示的差异取决于提交历史和合并过程中引入的更改。你看到或看不到的差异与合并的执行方式和结果更改有关。
以下是你可能会看到两个合并提交的不同行为的原因:

显示合并提交的差异:

git show显示合并提交的差异时,这通常意味着合并本身引入了更改,即正在合并的分支之间存在冲突更改。Git可以显示冲突解决或合并过程中所做更改导致的差异。

合并提交不显示差异:

如果git show没有显示合并提交的差异,则表明合并没有引入任何额外的更改。如果合并是“快进”合并,则可能会发生这种情况。在这种情况下,Git只是移动了分支指针,而没有创建额外的合并提交,因为分支之间不存在冲突的更改。

关于从合并提交中挑选特定差异:

从合并提交中挑选一个特定的diff并不简单,因为合并提交代表了来自多个分支的更改的集成。Git要求你在挑选合并提交时指定你想要挑选哪个父级的更改。当尝试挑选合并提交时,Git需要知道应用哪个父级的更改:

git cherry-pick -m 1 df57721f9a63e8a1fb9b9b2e70de4aa4c7e0cd2e

字符串
这里,-m 1指定第一个父级。您可能需要根据分支的合并历史记录确定适当的父级编号。
如果您对由特定分支引入到当前分支中的精选更改感兴趣,请考虑直接使用该分支的分支名称或提交散列,而不是合并提交。
请记住,从合并提交中挑选樱桃涉及选择合并的一方,理解不同分支引入的更改的上下文对于有效地挑选樱桃至关重要。

yzxexxkh

yzxexxkh2#

看看diff header:

diff --cc arch/arm64/mm/trans_pgd.c

字符串
diff --cc。来自man git show:[1]
对于提交,它显示日志消息和文本差异。它还以git diff-tree --cc生成的特殊格式显示合并提交
然后从man git diff-tree开始:
这个标志改变了合并提交补丁的显示方式,类似于-c选项。它隐含了-c和-p选项,并通过省略不感兴趣的块来进一步压缩补丁输出,这些块的父对象中的内容只有两个变体,合并结果会选择其中一个而不进行修改。当所有块都不感兴趣时,提交本身和提交日志消息不会显示,就像任何其他“空差异”情况一样。
这个(树)diff变量不会显示任何可以自动合并的内容。它只显示两个父对象都有修改的区块。请参阅示例中的第一个区块:

diff --cc arch/arm64/mm/trans_pgd.c
index e9ad391fc8ea,a01493f3a06f..7b14df3c6477
--- a/arch/arm64/mm/trans_pgd.c
+++ b/arch/arm64/mm/trans_pgd.c
@@@ -41,9 -40,8 +41,9 @@@ static void _copy_pte(pte_t *dst_ptep,
         * read only (code, rodata). Clear the RDONLY bit from
         * the temporary mappings we use during restore.
         */
-       set_pte(dst_ptep, pte_mkwrite(pte));
+       set_pte(dst_ptep, pte_mkwrite_novma(pte));
 -  } else if (debug_pagealloc_enabled() && !pte_none(pte)) {
 +  } else if ((debug_pagealloc_enabled() ||
 +         is_kfence_address((void *)addr)) && !pte_none(pte)) {
        /*
         * debug_pagealloc will removed the PTE_VALID bit if
         * the page isn't in use by the resume kernel. It may have


请注意,这里有两个差异(请参阅单字符缩进)。这意味着块重叠并存在冲突。您可以使用以下命令重新创建冲突:

$ git show --remerge-diff df57721f9a63e8a1fb9b9b2e70de4aa4c7e0cd2e
[...]
diff --git a/arch/arm64/mm/trans_pgd.c b/arch/arm64/mm/trans_pgd.c
remerge CONFLICT (content): Merge conflict in arch/arm64/mm/trans_pgd.c
index 297b0f83b2596..7b14df3c64776 100644
--- a/arch/arm64/mm/trans_pgd.c
+++ b/arch/arm64/mm/trans_pgd.c
@@ -41,17 +41,9 @@ static void _copy_pte(pte_t *dst_ptep, pte_t *src_ptep, unsigned long addr)
                 * read only (code, rodata). Clear the RDONLY bit from
                 * the temporary mappings we use during restore.
                 */
-<<<<<<< b97d64c722598 (Merge tag '6.6-rc-smb3-client-fixes-part1' of git://git.samba.org/sfrench/cifs-2.6)
-               set_pte(dst_ptep, pte_mkwrite(pte));
+               set_pte(dst_ptep, pte_mkwrite_novma(pte));
        } else if ((debug_pagealloc_enabled() ||
                   is_kfence_address((void *)addr)) && !pte_none(pte)) {
-||||||| 06c2afb862f9d
-               set_pte(dst_ptep, pte_mkwrite(pte));
-       } else if (debug_pagealloc_enabled() && !pte_none(pte)) {
-=======
-               set_pte(dst_ptep, pte_mkwrite_novma(pte));
-       } else if (debug_pagealloc_enabled() && !pte_none(pte)) {
->>>>>>> 1fe428d3692fb (x86/shstk: Change order of __user in type)


是否有可能选择对应于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上(我想我应该很快升级)

相关问题