"git show <tag>" 将 "git diff" 输出附加到标记摘要的末尾

"git show <tag>" appends "git diff" output to the end of tag summary

我有两个项目(A 和 B)都有 "master" 和 "devel" 分支。在项目 A 中,我将 "devel" 与 "master" 合并(git 还要求我添加合并消息),然后在 master 分支上将最后一次提交标记为 "v1.0"。当我在项目 A 的 master 分支上发出 "git show v1.0" 时,输出被简化为:

tag v1.0
Tagger: Ekin Akoglu <XXX@XXX.XXX.XXX.XXX>
Date:   Tue Mar 3 17:33:52 2015 +0100

Version 1.0 - Rozana

commit 3bede2111540b0b57ae994e3a16a98203c07c02e
Merge: 179d4b1 cd3337a
Author: Ekin Akoglu <XXX@XXX.XXX.XXX.XXX>
Date:   Tue Mar 3 17:01:35 2015 +0100
    Merge branch 'Tampa_Bay'

    Implementation of EwE 6.5 modifications. Updated testcase files.

在项目B中,我还合并了"devel"和"master"(git没有让我添加合并消息)。但是,在 "devel" 分支上,我错误地将最后一次提交标记为 "v1.0"。然后我删除了这个标签并切换到项目 B 的 "master" 分支并将最后一次提交标记为 "v1.0"。然后,我发出"git show v1.0",输出是

tag v1.0
Tagger: Ekin Akoglu <XXX@XXX.XXX.XXX.XXX>
Date:   Tue Mar 3 19:37:07 2015 +0100

version 1.0 - Rozana

commit 0835d7
Author: Ekin Akoglu <XXX@XXX.XXX.XXX.XXX>
Date:   Tue Mar 3 16:57:03 2015 +0100

    Implemented EwE 6.5 modifications. Updated test case files
    and respective comparative scripts. Removed mosca0D test cases.

加上大量 git-diff 输出附加在上述消息的末尾。任何人都可以告诉我这两个项目之间的区别是什么,以便项目 B 显示附加到标记消息摘要末尾的 git-diff 输出,而项目 A 没有?

谢谢。

项目 A 中,标签 v1.0 在 合并提交 上。 Git 要求您提供合并消息,可能是因为无法快进。只要目标分支的尖端不在您正在合并的分支的直接历史中,就会发生这种情况。您可以在图形历史记录查看器中轻松看到这一点,或者只需查看上面输出中的 Merge: 179d4b1 cd3337a 行即可。

项目 B 中,您的合并是 快进,因为 master 上没有任何更改(即它在 develop 的直接历史中)。因此,您的 v1.0 标记处于正常提交状态。

如果您使用 git show,这个差异很重要,因为 git show 将始终显示引用提交引入的差异。在项目 A 中,如果您的合并没有引入任何修改(即在合并期间没有修改添加的内容,没有解决冲突......),则没有差异。在项目 B 中,您会看到差异,因为标记的提交是 "normal"。

你在合并时可以做的是强制合并提交 --no-ff:

git checkout master
git merge develop --no-ff

这将产生与项目 A 相同的 git show 输出。强制执行合并提交是一个好习惯,因为合并提交消息将包含合并中包含的所有提交消息的列表(请参阅 Git Flow 例如)。