关于git的快速提问,特别是使用
时出现的--diff-filter字母 git show <rev> --name-status --oneline
我注意到在某些文件中,我得到的结果如下:
AM contrib / platform / src / com / sun / jna / platform / win32 / WinUser.java
如何添加和修改此文件? 我也得到如下结果:
MM CHANGES.md
这可能是由修改后的提交引起的吗? 还有其他可能的原因吗?
由于
答案 0 :(得分:3)
git show
命令可以显示合并提交以及非合并提交。您正在显示合并。
当您要求git show
显示合并提交时,它会使用&#34;组合差异&#34;默认情况下。例如,这里是git源本身提交的一部分(部分)。我在这里使用了HEAD^
,因为这个特定的合并提交碰巧有正确的变化来产生一个有趣的结果。我将首先举例说明,然后解释发生了什么。
$ git show HEAD^
commit 4109c28e055dba27d73cefb956bea5e611f66ec0
Merge: a3d54f9 e09867f
Author: Junio C Hamano <gitster@pobox.com>
Date: Tue Aug 26 11:16:26 2014 -0700
Merge branch 'jk/diff-tree-t-fix'
让我们添加--name-status --oneline
:
$ git show --name-status --oneline HEAD^
4109c28 Merge branch 'jk/diff-tree-t-fix'
MM combine-diff.c
MM t/t4038-diff-combined.sh
这看起来很像你的,虽然我们只有MM
而不是AM
。
现在让我们添加-m
(这会很长,所以我会把它剪掉):
$ git show -m --name-status --oneline HEAD^
4109c28 (from a3d54f9) Merge branch 'jk/diff-tree-t-fix'
M combine-diff.c
M t/t4038-diff-combined.sh
4109c28 (from e09867f) Merge branch 'jk/diff-tree-t-fix'
M .gitignore
M .mailmap
[...]
M column.c
M combine-diff.c
M command-list.txt
[...]
-m
的输出最容易解释。合并提交是一个包含两个或多个父项的提交,-m
命令显示对每个父项的提交差异:
git show
这里合并提交... - A - M
/
... - B
(在git源的情况下为M
,这里)将commit 4109c28
(A
)作为其第一个父项,并{{1 } {(a3d54f9
)作为第二个。将B
的内容与e09867f
进行比较,我们发现文件A
和M
已被修改。将combine-diff.c
与t/t4038-diff-combined.sh
的内容进行比较,我们发现许多文件已被修改,包括B
(并且在输出中我剪掉了M
也是)。
当git显示&#34;组合差异&#34;时,它首先过滤掉所有未从两个父母(或#34;所有父母和#34; 3或更多父母合并)。也就是说,它不被认为是有趣的&#34; combined-diff.c
已从t/t4038-diff-combined.sh
修改为column.c
,因为未从B
修改为M
。但A
在两个不同的差异中都被更改,因此它会保留在组合差异中。
如果添加M
,只需保留与过滤器匹配的那些差异,即可进一步减少差异。
在任何情况下,合并差异&#34;状态&#34;部分显示为一系列状态,每个父母一个。这里的序列combined-diff.c
表示在merge和first-parent之间添加了文件,而在merge和second-parent之间,文件被修改了。您还可以获得--diff-filter
(如上例所示),AM
(从第一个父级修改,从第二个添加),MM
和MA
,依此类推。我公平地,但不完全,确定你不会看到重命名和副本(文档说没有得分号,只显示一条路径,这将是重命名和复制的问题)。在每种情况下,每个字母都有其通常的含义。你在这里看到的是任何一个空格作为修改状态字母之一的情况,因为这意味着&#34;没有变化&#34;因为&#34;没有改变某些家长&#34;从组合的差异中被丢弃。
有关组合差异的更多信息,请参阅&#34;组合DIFF格式&#34;部分,例如the git diff-tree
documentation。