【问题标题】:How do I show the changes which have been staged?如何显示已上演的更改?
【发布时间】:2010-12-07 22:53:42
【问题描述】:

我提交了一些更改;如何查看为下一次提交暂存的所有文件的差异?我知道git status,但我想查看实际的差异 - 而不仅仅是暂存文件的名称。

我看到git-diff(1) 手册页说

git diff [--options] [--] […]

此表单用于查看您对索引所做的更改(下一次提交的暂存区)。换句话说,差异在于您可以告诉 git 进一步添加到索引中,但您仍然没有。您可以使用 git-add(1) 暂存这些更改。

不幸的是,我无法完全理解这一点。一定有一些方便的单线,我可以为其创建别名,对吧?

【问题讨论】:

  • git status -v 也可以。见my answer below
  • @VonC 我总是使用它,但通过管道传送到less,如:git status -v | less - 可管理的块:)

标签: git diff dvcs git-diff git-stage


【解决方案1】:

对于暂存区与存储库(最后一次提交)比较使用

$ git diff --staged

该命令将您的暂存 ($ git add fileName) 更改与您的上次提交进行比较。如果您想查看已暂存的内容将进入您的下一次提交,您可以使用 git diff --staged。此命令将您的暂存更改与上次提交进行比较。

用于工作与暂存比较使用

$ git diff 

该命令将您工作目录中的内容与暂存区域中的内容进行比较。重要的是要注意 git diff 本身并不会显示自上次提交以来所做的所有更改 - 仅显示仍未暂存的更改。如果您已暂存所有更改($ git add fileName), git diff 将不会给您任何输出。

另外,如果您暂存一个文件 ($ git add fileName) 然后对其进行编辑,您可以使用 git diff 查看暂存文件中的更改以及未暂存的更改。

【讨论】:

  • "对于工作与存储库的比较,请使用$ git diff"。我很确定git diff 比较了工作与分期。见stackoverflow.com/a/1587952
【解决方案2】:

另一个使这变得简单的工具是 Emacs 中的 Magit 模式。它的默认视图列出了暂存和未暂存的更改。它就像类固醇上的git add -p,因为您可以使用编辑器命令轻松地暂存或取消暂存大块(甚至单行代码)。了解标准的git瓷器很重要,但我已经很少使用git diff --cached了。

https://magit.vc/

【讨论】:

    【解决方案3】:

    使用视觉差异工具

    默认答案(在命令行中)

    此处的最佳答案正确显示了如何查看Index 中的缓存/暂存更改:

    $ git diff --cached
    

    $ git diff --staged,这是一个别名。



    改为启动 Visual Diff 工具

    默认答案将在 git bash 中(即在命令行或控制台中)吐出差异更改。对于那些喜欢暂存文件差异的可视化表示的人,git 中有一个可用的脚本,它为每个查看的文件启动一个可视化差异工具,而不是在命令行上显示它们,称为difftool

    $ git difftool --staged
    

    这将与git diff --staged 执行相同的操作,除了任何时候运行差异工具(即每次通过差异处理文件时),它将启动默认的可视差异工具(在我的环境中,这是 kdiff3)。

    工具启动后,git diff 脚本将暂停,直到您的可视化 diff 工具关闭。因此,您需要关闭每个文件才能查看下一个文件。



    你总是可以在 git 命令中使用 difftool 代替 diff

    对于您所有的视觉差异需求,git difftool 将代替任何 git diff 命令,包括所有选项。

    例如,要在不询问是否为每个文件执行此操作的情况下启动可视差异工具,请添加 -y 选项(我认为通常您会想要这个!):

    $ git difftool -y --staged
    

    在这种情况下,它会在视觉差异工具中拉出每个文件,一次一个,在工具关闭后调出下一个。

    或者查看Index中暂存的特定文件的差异:

    $ git difftool -y --staged <<relative path/filename>>
    

    有关所有选项,请参见手册页:

    $ git difftool --help
    


    设置可视化 Git 工具

    要使用默认以外的可视化 git 工具,请使用 -t &lt;tool&gt; 选项:

    $ git difftool -t <tool> <<other args>>
    

    或者,请参阅 difftool 手册页,了解如何配置 git 以使用不同的默认可视 diff 工具。



    示例.gitconfig vscode 作为差异/合并工具的条目

    设置 difftool 的一部分涉及更改 .gitconfig 文件,或者通过 git 命令在后台更改它,或者直接编辑它。

    您可以在您的主目录中找到您的.gitconfig,例如在 Unix 中为 ~,在 Windows 中通常为 c:\users\&lt;username&gt;

    或者,您可以在默认 Git 编辑器中使用 git config -e --global 打开用户 .gitconfig

    以下是我的全局用户 .gitconfig 中的示例条目,用于 VS Code 作为差异工具和合并工具:

    [diff]
        tool = vscode
        guitool = vscode
    [merge]
        tool = vscode
        guitool = vscode
    [mergetool]
        prompt = true
    [difftool "vscode"]
        cmd = code --wait --diff \"$LOCAL\" \"$REMOTE\"
        path = c:/apps/vscode/code.exe
    [mergetool "vscode"]
        cmd = code --wait \"$MERGED\"
        path = c:/apps/vscode/code.exe
    

    【讨论】:

      【解决方案4】:

      --cached 对我不起作用,...哪里受 git log 启发

      git diff origin/&lt;branch&gt;..&lt;branch&gt; 做了。

      【讨论】:

        【解决方案5】:

        应该是:

        git diff --cached
        

        --cached 表示针对当前HEAD 显示缓存/索引中的更改(即分阶段更改)。 --staged--cached 的同义词。

        --staged--cached 不指向HEAD,只是相对于HEAD 的区别。如果您选择使用git add --patch(或git add -p)提交的内容,--staged 将返回暂存的内容。

        【讨论】:

        • 如果您只想要文件名,请在stackoverflow.com/a/4525025/255187 的每个帖子中执行以下git diff --name-only --cached
        • 将其与git difftool --staged 一起使用而不是git diff --staged 以在每个文件上启动默认的视觉差异工具。 difftool 也可以用任何其他参数替换 diff
        • 您可以使用git difftool --staged -d 在可视化工具中区分两个目录,而不是一次一个文件。
        • 因为这个被标记为答案并首先显示它应该在顶部包含 git diff,然后是 git [[others]],只是我的 2 美分
        • 并查看单个暂存文件中的更改,以下将起作用:git diff --cached -- &lt;stagedfile&gt;
        【解决方案6】:

        默认情况下 git diff 用于显示未添加到 git 更新文件列表中的更改。但是如果你想显示添加或暂存的更改,那么你需要提供额外的选项,让 git 知道你对暂存或添加的文件感兴趣 diff

        $ git diff          # Default Use
        $ git diff --cached # Can be used to show difference after adding the files 
        $ git diff --staged # Same as 'git diff --cached' mostly used with latest version of git 
        

        示例

        $ git diff 
        diff --git a/x/y/z.js  b/x/y/z.js index 98fc22b..0359d84 100644
        --- a/x/y/z.js 
        +++ b/x/y/z.js @@ -43,7 +43,7 @@ var a = function (tooltip) {
        
        -        if (a)
        +        if (typeof a !== 'undefined')
                     res = 1;
                 else
                     res = 2;
        
        $ git add x/y/z.js
        $ git diff
        $
        

        一旦你添加了文件,你就不能使用'git diff'的默认值。你必须这样做:-

        $ git diff --cached
        diff --git a/x/y/z.js  b/x/y/z.js index 98fc22b..0359d84 100644
            --- a/x/y/z.js 
            +++ b/x/y/z.js @@ -43,7 +43,7 @@ var a = function (tooltip) {
        
            -        if (a)
            +        if (typeof a !== 'undefined')
                         res = 1;
                     else
                         res = 2;
        

        【讨论】:

          【解决方案7】:

          一个简单的图形使这一点更清楚:

          git diff

          显示工作目录和索引之间的变化。这显示了已更改的内容,但未暂存以进行提交。

          git diff --cached

          显示索引和 HEAD(这是此分支上的最后一次提交)之间的更改。这显示了已添加到索引并暂存以进行提交的内容。

          git diff 头

          显示工作目录和 HEAD 之间的所有更改(包括索引中的更改)。这显示了自上次提交以来的所有更改,无论它们是否已被暂存。

          还有

          365Git.有更多细节

          【讨论】:

          • 恐怕这太天真了(就像任何 git 解释的情况一样)。如果你对foo.c进行了本地修改并且不执行git add foo.c,那么foo.c不在索引中;它不是为提交而上演的。如果git diff foo.c 天真地将工作的foo.c 与索引进行比较,那么它必须显示一个空/不存在的文件与foo.c 的全部内容之间的巨大差异。所以事实上,当索引中不存在文件时,git diff 会回退到该文件,使用 HEAD 副本。
          • @Kaz 严格来说,索引不是一张白纸。它是应用了分阶段更改的HEAD 的虚拟副本。请记住,Git 通过保存更改而不是通过保存整个文件来工作。当您暂存文件时,它仅存储所做的更改。如果索引像您暗示的那样是空白的,它将不知道如何保存索引中的更改,并且必须将整个文件保存为“新添加的” - 这是错误的。
          • @Kaz 索引和HEAD 都将具有foo.c 文件的未更改版本(它们不是物理副本,而只是你和我的逻辑副本。对于Git,它们只是曾经涉及该文件的每个提交所引用的相同数据流)。因此,当您在 完全 未暂存的 foo.c 上执行 git diff 时,它并没有真正回退到 HEAD 它实际上是在使用索引进行差异(它恰好包含文件的完全相同版本正如HEAD 所做的那样)。所以图形是正确的。
          • 您好,我想知道在这种情况下“index”是什么意思?谢谢!
          • @TomRussell git status -v 等价于git diff --cached(当然还有git status
          【解决方案8】:

          你可以使用这个命令。

          git diff --cached --name-only
          

          git diff--cached 选项表示获取暂存文件,--name-only 选项表示仅获取文件名。

          【讨论】:

          • 请编辑更多信息。不建议使用纯代码和“试试这个”的答案,因为它们不包含可搜索的内容,也没有解释为什么有人应该“试试这个”。
          • 不知道为什么我想要这个,使用--name-only 选项我不妨使用常规的git status
          【解决方案9】:

          还可以考虑gitk 工具,它与 git 一起提供,对查看更改非常有用

          【讨论】:

            【解决方案10】:

            如果您的意图是推送一个远程 repo 分支,并且您在提交更改日志中的第一次传递不完整,您可以在推送之前更正提交语句。

            本地

            ...进行一些更改...

            git diff # look at unstaged changes
            
            git commit -am"partial description of changes"
            

            ...回忆提交中未提及的更多更改...

            git diff origin/master # 查看暂存但未推送的更改

            ...修改分阶段提交语句...

            git commit --amend -m"i missed mentioning these changes ...."
            
            git push
            

            【讨论】:

              【解决方案11】:

              从 1.7 及更高版本开始应该是:

              git diff --staged
              

              【讨论】:

                【解决方案12】:

                git guigit-cola 是图形实用程序,可让您查看和操作索引。两者都包含用于暂存文件的简单视觉差异,git-cola 还可以启动更复杂的并排视觉差异工具。

                How to remove a file from the index in git? 上查看我密切相关的答案,以及Git - GUI Clients 的官方目录。

                【讨论】:

                  【解决方案13】:

                  注意git status -v 显示了阶段性的变化! (这意味着您需要分阶段进行 -- git add -- 一些更改。没有分阶段的更改,没有与git status -v 的差异。
                  自从Git 1.2.0, February 2006)

                  在其长格式(默认)中,git status 有一个未记录的“详细”选项,它实际上显示了 HEAD 和索引之间的差异。

                  它即将变得更加完整:参见“Show both staged & working tree in git diff?”(git 2.3.4+,2015 年第二季度):

                  git status -v -v
                  

                  【讨论】:

                  • 最后一行应该是git diff HEAD
                  • @artur 为什么?答案的重点是提到git status -vv 还包括git diff HEAD 所做的事情。
                  • 不适用于git version 1.8.3.1。我知道它很旧,但如果可能的话,请记下这个标志是什么时候引入的。
                  • @onebree 1.8.3.1 是 2013 年 6 月,确实很旧。但是git status -v 更旧(github.com/git/git/commit/…,git 1.2.0,2006 年 2 月!)。请注意,它会显示 indexHEAD 之间的差异:如果您在索引中添加了任何内容(没有 git add),那么 git status -v 将不会显示任何差异。 git status -v -v 较新(Git 2.3.4,2015 年 3 月)
                  • @VonC 那是我的错误...我做了git diff -v
                  【解决方案14】:

                  如果您对视觉并排视图感兴趣,diffuse 视觉差异工具可以做到这一点。如果部分但不是全部更改已上演,它甚至会显示三个窗格。在发生冲突的情况下,甚至会有四个窗格。

                  调用它

                  diffuse -m
                  

                  在您的 Git 工作副本中。

                  如果您问我,十年来我见过的最佳视觉效果不同。此外,它并非特定于 Git:它与大量其他 VCS 互操作,包括 SVN、Mercurial、Bazaar、...

                  另见:Show both staged & working tree in git diff?

                  【讨论】:

                  • 谢谢,这看起来是个不错的工具。到目前为止,我发现 Meld 是 Linux 上最好的视觉差异工具,但我错过了能够从剪贴板中区分文本的能力——Meld 需要输入文件。漫反射允许这样做,以及手动重新对齐。会尝试一段时间。
                  • diffuse.sourceforge.net 的链接断开,现在使用sourceforge.net/projects/diffuse
                  • brew install diffuse 适用于 OS X。如果未暂存和暂存更改都不会显示 3 个窗格 - 您的意思是索引中还没有更改吗?
                  • 你有哪个版本的diffuse?是的——如果你添加一个文件然后在本地修改它,它应该显示三个窗格。
                  • 您也可以将 diffuse 设置为您的默认 difftool 并使用该内置机制/工具/别名来启动它。在这里查看我的答案:stackoverflow.com/a/45684512/6501141>
                  【解决方案15】:

                  如果您有多个分阶段更改的文件,使用git add -i 可能更实用,然后选择6: diff,最后选择您感兴趣的文件。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-01-06
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-03-02
                    • 1970-01-01
                    相关资源
                    最近更新 更多