gpt4 book ai didi

git show --name-status 字母 : when can more than one letter appear?

转载 作者:太空狗 更新时间:2023-10-29 14:46:07 26 4
gpt4 key购买 nike

关于 git 的快速问题,特别是 --diff-filter字母,因为它们在使用时出现

git show <rev> --name-status --oneline.

我注意到在某些文件中,我得到的结果如下:

AM contrib/platform/src/com/sun/jna/platform/win32/WinUser.java

这个文件怎么可能既被添加又被修改?我还得到如下结果:

MM CHANGES.md

这可能是由修改后的提交引起的吗?还有其他可能的原因吗?

谢谢

最佳答案

git show 命令可以显示 merge 提交和非 merge 提交。您正在显示 merge 。

当您要求 git show 显示 merge 提交时,它默认使用“组合差异”。例如,这是 git 源本身中的(部分)提交。我在这里使用了 HEAD^,因为这个特定的 merge 提交恰好有正确的更改类型来产生有趣的结果。我会先给出例子,然后再解释是怎么回事。

$ 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 的输出是最容易解释的。 merge 提交是具有两个或更多父项的提交,使用 -m 时,git show 命令会按顺序显示每个父项的提交差异:

... - A - M
/
... - B

此处 merge 提交 M(4109c28 在 git 源的情况下,此处)具有提交 A(a3d54f9) 作为其第一个父级,B (e09867f) 作为其第二个。比较AM的内容,我们发现文件combine-diff.ct/t4038-diff-combined。 sh 被修改。比较BM的内容,我们发现修改了很多文件,包括combined-diff.c (并且,在输出中我也删除了 t/t4038-diff-combined.sh)。

当 git 显示“组合差异”时,它首先过滤掉所有未更改的文件 both parents(或 3 个或更多 parent merge 的“所有 parents”)。也就是说,column.cB 修改为 M 并不被认为是“有趣的”,因为它不是A 修改为 M。但是 combined-diff.c 在两个单独的 diff 中都发生了变化,因此它保留在组合 diff 中。

如果您添加 --diff-filter,这将通过仅保留与过滤器匹配的那些差异来进一步减少差异。

在任何情况下,组合的 diff 的“状态”部分显示为一系列状态 es,每个父级一个。这里的序列 AM 表示在 merge 和 first-parent 之间,文件被添加,而在 merge 和 second-parent 之间,文件被修改。您还可以获得 MM(如上例所示)、MA(从第一个父级修改,从第二个添加)、MTTM等。我相当但不完全确定您不会看到重命名和副本(文档说没有分数,只显示一条路径,这对重命名和复制来说是个问题)。在每种情况下,每个字母都有其通常的含义。您在这里看不到任何带有空格作为修改状态字母之一的情况,因为这意味着“没有变化”,并且因为“没有来自某些父项的变化”从组合差异中被丢弃。

有关组合差异的更多信息,请参阅“组合差异格式”部分,例如 the git diff-tree documentation .

关于git show --name-status 字母 : when can more than one letter appear?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26261351/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com