什么是git show
?
git show
命令是用于显示git
中对象信息的通用命令。
从手册中可以查到(git help show
):
Shows one or more objects (blobs, trees, tags and commits).
...
For commits it shows the log message and textual diff.
It also presents the merge commit in a special format as produced by
git diff-tree --cc
...
因此,git show
的输出不同,因为这是一个合并提交而不是普通提交。
git diff-tree --cc
的 man 手册说:
--cc
This flag changes the way a merge commit patch is displayed, in a
similar way to the -c option. It implies the -c and -p options and
further compresses the patch output by omitting uninteresting hunks whose
the contents in the parents have only two variants and the merge result
picks one of them without modification. When all hunks are uninteresting,
the commit itself and the commit log message is not shown, just like in
any other "empty diff" case.
进一步
-c
This flag changes the way a merge commit is displayed (which means
it is useful only when the command is given one <tree-ish>, or
merge result simultaneously instead of showing pairwise diff
between a parent and the result one at a time (which is what the -m
option does). Furthermore, it lists only files which were modified
from all parents.
请注意我在这里重申的最后一行:
Furthermore, it lists only files which were modified from all parents.
当使用git show
查看合并提交时,它只会列出与该提交相比较的所有父提交所修改的文件。对于普通合并(即2个父提交的情况),这正好是被合并的文件。例如,如果您执行以下合并操作:
git checkout master
git merge feature
git show
列出的文件是在合并之前
同时修改了
master
和
feature
的文件,并在合并提交中合并在一起的文件。
对于八爪鱼式合并——即多于两个父级的合并——结果文件必须与所有父级中的文件不同才能由
git show
显示。
请注意,使用
git show
查看合并提交时,还可能显示其他文件。例如,如果您调用
git merge --no-commit
,然后在提交之前执行以下任何操作,则这些文件也将由
git show
显示在合并提交中:
- 添加新文件。
- 删除现有文件。
- 修改任何文件,包括已经被git merge暂存的文件。
结论
git show
所做的是显示所谓的
组合差异。
运行命令
git show
在合并提交上的结果可以认为只显示了被合并的文件,而不是那些只是从其中一个父级简单地复制过来的文件。
这有点令人惊讶,因为很多人期望能够看到相对于刚刚合并的分支进行了哪些文件修改。
那么,如果您想查看任何一个父级之间的差异,该怎么办呢?
让我们最后再看一下
git show
的手册页面:
COMBINED DIFF FORMAT
Any diff-generating command can take the `-c` or --cc option to produce
a combined diff when showing a merge. This is the default format when
showing merges with git-diff(1) or git-show(1). Note also that you can
give the `-m' option to any of these commands to force generation of
diffs with individual parents of a merge.
所以我们可以使用-m
选项来获取两个差异,如下:
git show -m commit
这将为您提供与所有父提交逐个对比的差异。
要查看合并提交和您合并到其中的分支上一个提交之间的差异(即第一个父提交),请使用以下任一命令:
git show --first-parent commit
git diff commit^..commit
git diff commit^!
--first-parent
选项真正属于git log
,但也适用于git show
。符号commit^!
是commit^..commit
的缩写。
要查看合并提交和您合并的分支之间的差异(例如,查看您从另一个分支中省略了什么),请使用
git diff commit^2..commit
commit^2
表示
commit
的第二个父提交。
如果您有多个父提交(例如,一个章鱼合并),那么我相信您可以猜到如何对比第三、第四等提交。
git diff-tree c248261
没有返回任何内容。然而,git diff-tree --name-only c248261^ c248261
返回了预期的结果。我以为它们是等价的,但是阅读手册后我发现它们并不相同。 - mgdgit diff-tree
的 man 页面上说:“如果只有一个 <tree-ish> 给定,则将提交与其父提交进行比较(参见下面的 --stdin)。”,而在--stdin
下,它写道:“当只给定一个提交时,将提交与其父提交进行比较。” 不确定这到底是什么意思。 - mgd