【问题标题】:How can I see the changes in a Git commit?如何查看 Git 提交中的更改?
【发布时间】:2013-07-07 23:23:30
【问题描述】:

当我执行git diff COMMIT 时,我看到了该提交和 HEAD 之间的更改(据我所知),但我想查看该单个提交所做的更改。

我在 diff / log 上没有找到任何明显的选项可以给我这样的输出。

【问题讨论】:

标签: git version-control diff git-diff


【解决方案1】:

查看特定COMMIT 哈希的差异,其中COMMIT 是提交的哈希:

git diff COMMIT~ COMMIT 将显示COMMIT 的祖先和COMMIT 之间的区别。有关命令的详细信息,请参阅 git diff 的手册页,以及有关 ~ 符号及其朋友的 gitrevisions 的手册页。

或者,git show COMMIT 会做一些非常相似的事情。 (提交的数据,包括其差异 - 但不用于合并提交。)请参阅git show manpage

git diff COMMIT 也会告诉你COMMIT 和头部之间的区别。)

【讨论】:

  • 请注意,^ 需要在 Thomson 和 Bourne shell(那里是 | 的同义词)和 rc 及其派生词(插入符号运算符)和 zsh 中引用,并带有扩展的 glob已启用(not globbing 运算符)
  • 请注意,HEAD^ 表示第一个父级,以防一个提交有多个父级(即合并提交)。
  • git diff COMMIT~ COMMIT 为我工作,注意波浪号而不是插入符号。我在 Windows 10 上运行 git 版本 2.6.1.windows.1。
  • @tradetree:COMMIT 这个词应该被替换为某个提交的名称,例如SHA 总和。
  • 我觉得 git show 更适合这个问题,应该是先提的建议。
【解决方案2】:

如“Shorthand for diff of git commit with its parent?”中所述,您还可以将git diff 与:

git diff COMMIT^!

git diff-tree -p COMMIT

使用 git show,你需要(为了只关注差异)做:

git show --color --pretty=format:%b COMMIT

COMMIT 参数是 commit-ish

commit objectobject 可以递归地取消引用到提交对象。以下都是commit-ish:一个commit对象、一个指向commit对象的tag object、一个指向一个指向commit对象的tag对象的tag对象等等。

请参阅 gitrevision "SPECIFYING REVISIONS" 以引用 commit-ish。
另见“What does tree-ish mean in Git?”。

【讨论】:

    【解决方案3】:

    你也可以试试这个简单的方法:

    git show <COMMIT>
    

    【讨论】:

    • 这似乎做了一些完全不同的事情
    • 它只显示提交信息。不是应用于此提交的代码更改的差异。
    • 这应该是答案。
    • @k0pernikus 它对我有用
    【解决方案4】:

    git show 显示在最近一次提交中所做的更改。相当于git show HEAD

    git show HEAD~1 带您返回一个提交。

    【讨论】:

      【解决方案5】:

      我通常这样做:

      git diff HEAD~1
      

      显示有关上次提交的更改。如果您有更多提交,只需将数字 1 增加到您想要查看的提交 diff 数。

      【讨论】:

      • 要显示上次提交的更改,只需使用git show ;)
      【解决方案6】:

      用途:

      git show <commit_sha>
      

      这将向您展示该提交中的内容。您可以通过在两个提交 SHA-1 哈希之间放置一个空格来确定范围。

      git show <beginning_sha> <ending_sha>
      

      如果您经常变基,这将非常有用,因为您的功能日志将全部排成一行。

      如果您碰巧想查看最后 3 次提交,可以使用 HEAD 语法

      git show HEAD~3 HEAD
      

      【讨论】:

      • 你想做什么?我安装了 2.28.0 版,它按预期工作。
      • SHA-1 哈希是唯一的可能性吗(不是反问句)?怎么样,例如,HEAD~3
      • 是的,你可以使用 git show HEAD~3 HEAD 这样的东西,它比其他 git 命令有点笨拙,但它可以工作。
      【解决方案7】:

      首先使用获取提交 ID,

      git log #to list all
      

      或者

      git log -p -1 #last one commit id
      

      复制提交 ID。

      现在我们使用两种方法列出来自特定提交的更改,

      方法一:

      git diff commit_id^! #commit id something like this 1c6a6000asad012

      方法二:

      git show commit_id
      For example: git show 1c6a600a
      

      【讨论】:

      • ^! 是什么意思??
      • ^!是 commit^..commit 的简写,这意味着将排除所有父母并检查该提交中的差异
      • 我不是专家,但我有一个案例(涉及多个分支),其中 git log c^!与 git log c^..c 不完全相同。事实上它要好得多: git log c^..c 列出了太多条目,而 git log c^!做了正确的事,所以这就是我一直在寻找的东西
      【解决方案8】:

      来自git-diff(1) 的手册页:

      git diff [options] [<commit>] [--] [<path>…]
      git diff [options] --cached [<commit>] [--] [<path>…]
      git diff [options] <commit> <commit> [--] [<path>…]
      git diff [options] <blob> <blob>
      git diff [options] [--no-index] [--] <path> <path>
      

      使用中间的第三个:

      git diff [options] <parent-commit> <commit>
      

      同样来自同一个手册页,在底部,Examples section:

      $ git diff HEAD^ HEAD      <3>
      

      比较上次提交和上次提交前的版本。

      诚然,它的措辞有点令人困惑,但它会不那么令人困惑

      将最近的提交与之前的提交进行比较。

      【讨论】:

      • 您的改写将适用于git diff HEAD HEAD^
      • git diff HEAD^ HEAD 没有显示任何变化。
      • @user3690202 这意味着没有任何更改要显示。真的是这样吗?
      • 显示怎么可能没有变化?如果您想查看最后一次提交,除非它是一个全新的存储库,否则肯定会有一些更改要显示?
      • @user3690202 可以使用 Git 进行“空提交”,该提交实际上不包含来自父级的任何更改,尽管有一个内置的保护措施可以检查并防止这种情况,尽管它可以用命令行选项覆盖。我怀疑您是否会故意创建一个空提交,因此另一种可能性是您以某种方式对(或其他有趣的空白内容)进行了预提交行结束转换,这会诱使 Git 认为实际上没有进行任何更改。你在哪个平台上运行 Git?
      【解决方案9】:

      以下似乎可以完成这项工作;我用它来显示合并带来了什么。

      git whatchanged -m -n 1 -p <SHA-1 hash of merge commit>
      

      【讨论】:

      • 这对git log也有效吗? (因为stackoverflow.com/a/18585297/6309
      • git log --name-only - 用于列出更改的文件。或 git log --name-status --find-renames - 获取具有更改类型的更改文件列表(添加/修改/重命名等)
      【解决方案10】:

      另一种可能性:

      git log -p COMMIT -1
      

      【讨论】:

        【解决方案11】:

        我喜欢下面的命令来比较一个特定的提交和它的最后一个提交:

        git diff <commit-hash>^-
        

        例子:

        git diff cd1b3f485^-
        

        【讨论】:

          【解决方案12】:

          对我来说这很好用

          git show COMMIT --compact-summary
          

          显示下一条信息

          输出扩展头信息的简明摘要,例如文件创建或删除(“new”或“gone”,如果是符号链接,则可选“+l”)和模式更改(“+x”或“-x”在 diffstat 中分别添加或删除可执行位)。信息放在文件名部分和图形部分之间。隐含--stat。

          【讨论】:

          • 赞成,因为这实际上是我正在寻找的。我偶然发现了这个问题,因为“查看提交中的更改”可能意味着一些不同的事情。我想查看更改的文件,而不是实际更改的文件。继续阅读以了解文件中发生了什么变化的非常好的答案。
          【解决方案13】:

          您可以使用git diff HEAD HEAD^1 查看与父提交的差异。

          如果您只想查看文件列表,请添加--stat 选项。

          【讨论】:

          • 这就是你的意思,git diff HEAD^1 HEAD
          • 请注意,这会将您添加的内容显示为已删除,因为它会进行反向比较。您应该阅读diff 命令的方式是:我需要在文件中进行哪些更改才能从提交HEAD 到提交HEAD^1
          【解决方案14】:

          如果您只想查看最新提交中的更改,只需 git show 即可。

          【讨论】:

            【解决方案15】:
            git difftool COMMIT^ <commit hash>
            

            如果你已经配置了你的 difftool 也是可能的。

            在此处查看如何configure difftool。或手册页here

            此外,您可以使用git diff-tree --no-commit-id --name-only -r &lt;commit hash&gt; 查看在给定的提交哈希中更改/提交了哪些文件。

            【讨论】:

              【解决方案16】:

              要按提交查看作者和时间,请使用git show COMMIT。这将导致这样的结果:

              commit 13414df70354678b1b9304ebe4b6d204810f867e
              Merge: a2a2894 3a1ba8f
              Author: You <you@you.com>
              Date:   Fri Jul 24 17:46:42 2015 -0700
              
                   Merge remote-tracking branch 'origin/your-feature'
              

              如果您想查看哪些文件已更改,请使用上面 Merge 行中的值运行以下命令,git diff --stat a2a2894 3a1ba8f

              如果您想查看实际差异,请运行 git --stat a2a2894 3a1ba8f

              【讨论】:

              • "如果您想查看实际差异,请运行git --stat a2a2894 3a1ba8f"。我想你的意思是git diff a2a2894 3a1ba8f 或者unknown option: --stat
              • git show COMMIT 已经显示了正常提交的变更集。它只会在合并时不显示。
              【解决方案17】:

              以下代码将显示当前提交

              git show HEAD
              

              【讨论】:

                【解决方案18】:

                检查完整的更改:

                  git diff <commit_Id_1> <commit_Id_2>
                

                仅检查更改/添加/删除的文件:

                  git diff <commit_Id_1> <commit_Id_2> --name-only
                

                注意:为了检查 diff 而没有在两者之间提交,您不需要输入提交 ID。

                【讨论】:

                  【解决方案19】:

                  此命令将为您获取 Git 父提交哈希:

                  git log -n 2 <commit-hash>
                  

                  之后git diff-tool &lt;commit-hash&gt; &lt;parent-commit-hash&gt;

                  例子:

                  bonnie@bonnie ~/ $ git log -n 2 7f65b9a9d3820525766fcba285b3c678e889fe3
                  
                  commit 7f65b9a9d3820525766fcba285b3c678e889fe3b
                  Author: souparno <souparno.majumder@gmail.com>
                  Date:   Mon Jul 25 13:17:07 2016 +0530
                  
                  CSS changed to maintain the aspect ratio of the channel logos and to fit them properly.
                  
                  commit c3a61f17e14e2b80cf64b172a45f1b4826ee291f
                  Author: souparno <souparno.majumder@gmail.com>
                  Date:   Mon Jul 25 11:28:09 2016 +0530
                  
                  The ratio of the height to width of the channel images are maintained.
                  

                  之后

                  git difftool 7f65b9a9d3820525766fcba285b3c678e889fe3b c3a61f17e14e2b80cf64b172a45f1b4826ee291f
                  

                  【讨论】:

                    【解决方案20】:

                    我在 Windows 10 上运行 Git 版本 2.6.1.windows.1,所以我需要对 Nevik 的回答稍作修改(波浪号而不是插入符号):

                    git diff COMMIT~ COMMIT
                    

                    另一种选择是引用插入符号:

                    git diff "COMMIT^" COMMIT
                    

                    【讨论】:

                      【解决方案21】:

                      还可以查看特定文件的两次提交之间的更改。

                      git diff <commit_Id_1> <commit_Id_2> some_dir/file.txt
                      

                      【讨论】:

                      • git diff &lt;commit_Id&gt; on/specific/file.txt
                      【解决方案22】:

                      如果要检查源更改in a graphical view,请使用:

                      gitk (your commit id goes here)
                      

                      例如:

                      gitk HEAD~1 
                      

                      【讨论】:

                      • 我不明白为什么这个答案被否决了。我同意基于命令行和文本的东西是要走的路,但 gitk 提供了很多有用的信息。
                      • gitk 不是git,它是一个特殊的包,它并不存在于可以安装git 的每个操作系统上。tig 和其他许多工具一样也是很好的工具。
                      【解决方案23】:

                      一些答案​​错过了一个特殊情况。 如何查看 Root Commit 所做的更改,因为它没有父/祖先。

                      两者

                      git diff &lt;root_commit&gt;^..&lt;root_commit&gt;

                      git diff &lt;root_commit&gt;~..&lt;root_commit&gt;

                      抛出一个错误。

                      $git diff 27e521ca73a46b2d3a28568dc49fced81e46aaea~ 27e521ca73a46b2d3a28568dc49fced81e46aaea
                      fatal: ambiguous argument '27e521ca73a46b2d3a28568dc49fced81e46aaea~': unknown revision or path not in the working tree.
                      Use '--' to separate paths from revisions, like this:
                      'git <command> [<revision>...] -- [<file>...]'
                      

                      git diff &lt;root_commit&gt;^!

                      显示差异 btw root commit 和 HEAD。像这样:

                      $ git diff 27e521ca73a46b2d3a28568dc49fced81e46aaea^!
                      diff --git a/file1.txt b/file1.txt
                      new file mode 100644
                      index 0000000..80f3f1a
                      --- /dev/null
                      +++ b/file1.txt
                      @@ -0,0 +1,5 @@
                      +Create the first file.
                      +
                      +Add some placeholder text to first file.
                      +
                      +
                      diff --git a/file2.txt b/file2.txt
                      new file mode 100644
                      index 0000000..66e494f
                      --- /dev/null
                      +++ b/file2.txt
                      @@ -0,0 +1,6 @@
                      +This is the second file.
                      +
                      +It has an uncommited commit.
                      +
                      +We use it to demo default `git diff` behaviour.
                      +
                      
                      

                      (这些是我的 root 提交 和 HEAD 的所有提交所做的更改)。

                      对于根提交

                      我只找到了

                      git show --color --pretty=format:%b &lt;root_commit_hash&gt;

                      有效。

                      像这样:

                      $ git show --color --pretty=format:%b 27e521ca73a46b2d3a28568dc49fced81e46aaea
                      
                      diff --git a/README b/README
                      new file mode 100644
                      index 0000000..12a04f0
                      --- /dev/null
                      +++ b/README
                      @@ -0,0 +1,6 @@
                      +# git-diff-demo
                      +
                      +This repo documents the demo of the git diff command.
                      +We will have options, and use cases.
                      

                      (我的root commit只添加了README)

                      【讨论】:

                        猜你喜欢
                        • 2011-05-26
                        • 2014-01-28
                        • 2021-02-24
                        • 1970-01-01
                        • 1970-01-01
                        • 2013-11-15
                        • 1970-01-01
                        • 2012-09-30
                        • 1970-01-01
                        相关资源
                        最近更新 更多