【问题标题】:git: show all files changed between two commitsgit:显示两次提交之间更改的所有文件
【发布时间】:2011-03-09 20:21:48
【问题描述】:

git: show all changed files between two commits 的重复:我想要列出在两次提交之间已更改的所有文件,即使它们现在相同(即,更改然后又更改回来)。

【问题讨论】:

    标签: git


    【解决方案1】:

    我认为这个命令就是你的答案:

    git diff --stat abc123 xyz123  # where abc123 and xyz123 are SHA1 hashes of commit objects
    

    直接来自git community book

    如果您不想查看整个补丁,可以添加“--stat”选项,它将输出限制为已更改的文件以及一个小文本图,描述每个文件中更改了多少行文件。

    【讨论】:

    • 更具体地说,git diff --stat <commit1> <commit2>
    • 不,这完全不是他想要的。 Git diff 在树之间进行直接差异,它不考虑提交。如果您创建一个内容为“A”的新文件,然后将内容更改为“B”,然后将它们改回“A”,git diff --stat HEAD^^ HEAD 将为您提供空白输出。
    • git diff --name-only 可能比git diff --stat 好,但正如所指出的git diff 并没有做OP 想要的。
    【解决方案2】:

    我使用这个命令来比较两次提交之间的所有更改:

    git difftool -d <commit hash1> <commit hash2>

    像 git rebase 一样将所有本地提交压缩为一个。

    【讨论】:

      【解决方案3】:

      我会使用;取提交哈希的前 8 个。如果您愿意,可以按照以下方式通过管道输入文件:

      git log 12345678..87654321 > C:\GitChanges.txt
      

      【讨论】:

        【解决方案4】:

        如果只想查看提交b 按时间顺序在a 之后的文件名:

        git diff <a commit sha1>...<b commit sha2> --name-only # b is after a in time
        

        如果您想查看所有文件名以及从提交 a 到提交 b 的更改内容,请删除最后一个参数。

        git diff <a commit sha1>...<b commit sha2> # shows file names and what changed in each file
        

        &lt;commit sha1&gt; 的一个示例是提交 ID,例如 675ee6860d2c273bcc6c6a0536634a107e2a3d9f。通常前 8-10 位数字适用于大多数项目,但如果项目有大量提交,则可能需要更多。通常我使用来自git log --oneline 的 id 输出。

        当您得到 a...b 和 b 在时间上晚于 a 的差异时,很容易按时间顺序查看每个文件中的更改内容。

        【讨论】:

        • 这就是办法!
        【解决方案5】:

        这个类似于igorw的,但它避免了通过grep删除SHA:

        git log --pretty='format:' --name-only HEAD^^..HEAD | sort -u
        

        如果您还想查看文件是如何修改的,请将--name-only 替换为--name-status

        【讨论】:

        • 我刚刚测试了这个命令。处理大约需要 10 秒,然后开始吐出一个巨大的文件列表。
        • @ostler.c:您是否通过了"$@" 中的修订范围?否则,它将显示现有的更改,这很多:-) 我已经修改了我的答案以使用示例,就像在其他答案中一样。
        • 好吧,这是有道理的。我很惊讶我不知道“$@”。虽然,我发现它对大多数命令都不是很有用。
        • @ostler.c:我在git-showfiles 脚本中有这一行,"$@" 插入所有传递的参数;虽然有点晦涩(就像在 shell 脚本中一样),但这是非常标准的东西。
        【解决方案6】:

        这是我能想到的最好的:

        git log --name-only --pretty=oneline --full-index HEAD^^..HEAD | grep -vE '^[0-9a-f]{40} ' | sort | uniq
        

        将 HEAD^^ 和 HEAD 替换为您要比较的提交。

        我的尝试使用git log--name-only 列出指定文件之间每个提交的所有文件。 --pretty=oneline 使文件列表上方的部分仅包含提交 SHA 和消息标题。 --full-index 使 SHA 成为完整的 40 个字符。 grep 过滤掉任何看起来像 SHA 后跟空格的东西。除非您的文件以 SHA 开头后跟一个空格,否则结果应该是准确的。

        【讨论】:

        • 当我对 HEAD^ 和 HEAD 运行该命令时,我得到了存储库中每个文件的列表;甚至那些没有改变的。
        • 我的错,格式是“..”而不是“”。
        • 谢谢,有点尴尬,但它会做。
        • 确实很尴尬。我必须在提交 SHA 之间放置 3 个点(而不是如图所示的 2 个)才能使其正常工作。我认为 Bryce 的答案更简单(即在 git diff 命令上使用 --stat),它提供了更多信息(更改的文件数的摘要加上每个文件中更改的行数)。
        猜你喜欢
        • 2017-05-09
        • 1970-01-01
        • 2019-12-07
        • 2016-09-29
        • 2012-06-06
        • 1970-01-01
        • 2011-02-01
        • 1970-01-01
        相关资源
        最近更新 更多