2395

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

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

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

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

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

4

16 回答 16

2910

它应该只是:

git diff --cached

--cached表示针对当前HEAD. --staged是 的同义词--cached

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

于 2009-10-19T10:07:10.820 回答
1693

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

简单的 Git 差异

混帐差异

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

git diff --cached

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

git diff 头

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

还有

365Git有更多细节。

于 2009-10-19T10:27:21.643 回答
61

注意git status -v 显示了阶段性的变化!(这意味着您需要进行一些更改。 没有git add分阶段更改,没有git status -v.

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

它即将变得更加完整:请参阅“在 git diff 中同时显示分阶段和工作树? ”(git 2.3.4+,2015 年第二季度):

git status -v -v
于 2015-03-18T07:22:26.003 回答
56

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

带有分阶段和非分阶段编辑的漫反射屏幕截图

调用它

diffuse -m

在你的 Git 工作副本中。

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

另请参阅:在 git diff 中同时显示分阶段和工作树?

于 2012-10-24T21:05:35.580 回答
38

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

$ git diff --staged

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

对于工作与分期比较使用

$ git diff 

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

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

于 2017-02-25T21:16:27.390 回答
28

您可以使用此命令。

git diff --cached --name-only

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

于 2016-08-31T10:05:37.643 回答
24

使用视觉差异工具

默认答案(在命令行)

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

$ git diff --cached

或者$ git diff --staged哪个是别名。



改为启动 Visual Diff 工具

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

$ git difftool --staged

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

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



您可以随时使用difftool代替diffin git 命令

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

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

$ git difftool -y --staged

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

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

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

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

$ git difftool --help


设置可视化 Git 工具

要使用默认以外的可视化 git 工具,请使用以下-t <tool>选项:

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

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



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

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

您可以.gitconfig在您的主目录中找到您的,例如~在 Unix 中或通常c:\users\<username>在 Windows 中)。

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

以下是我.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
于 2017-08-14T23:33:54.663 回答
18

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

git diff --staged
于 2016-07-19T17:39:08.290 回答
9

如果您的意图是推送一个远程 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
于 2015-10-14T18:32:08.093 回答
8

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

于 2012-03-14T14:30:29.843 回答
7

默认情况下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;
于 2017-11-20T06:30:23.373 回答
2

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

请参阅如何从 git 中的索引中删除文件?,还有这个Git-GUI 客户端的官方目录。

于 2016-04-13T14:31:27.157 回答
2

要查看特定阶段文件(或文件)的差异,您可以使用

git diff --staged -- <path>...

例如,

git diff --staged -- app/models/user.rb
于 2022-01-25T18:36:52.213 回答
0

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

于 2016-08-03T10:40:51.427 回答
0

--cached我不起作用,...哪里,灵感来自git log

git diff origin/<branch>..<branch>做过。

于 2020-06-24T19:52:11.777 回答
0

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

https://magit.vc/

于 2021-07-28T18:19:04.170 回答