关于git:如何显示已上演的更改?

How do I show the changes which have been staged?

我准备了一些要提交的更改;如何查看为下一次提交准备的所有文件的差异?我知道Git的状态,但我想看看实际的差异——不仅仅是文件名的分级。

我看到Git Diff(1)手册页上说

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

This form is to view the changes you made relative to the index (staging area for the next commit). In other words, the differences are what you could tell git to further add to the index but you still haven't. You can stage these changes by using git-add(1).

不幸的是,我不能完全理解这一点。一定有一些方便的一行程序,我可以为它创建别名,对吗?


应该是:

1
git diff --cached

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

--staged--cached并不指向HEAD,只是与HEAD的区别。如果您选择使用git add --patchgit add -p提交什么,--staged将返回所执行的操作。


简单的图形使这一点更加清晰:

Simple Git diffs

差异比较

显示工作目录和索引之间的更改。这将显示已更改的内容,但不是为提交而准备的。

git diff--缓存

显示索引和头(这是该分支上的最后一次提交)之间的更改。这将显示为提交而添加到索引和分段的内容。

Git压头

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

也:

关于365Git有更多的细节。


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

氧化镁

用调用它

1
diffuse -m

在你的Git工作副本中。

如果你问我,十年来我看到的最好的视觉效果是不同的。此外,它并不是特定于Git的:它与大量其他VCS(包括SVN、Mercurial、Bazaar等)进行互操作。

另请参见:在Git Diff中显示阶段树和工作树?


注意,git status -v也显示了阶段性的变化!(意思是你需要进行一些改变——git add)。无阶段性变化,与git status -v无差异。从2006年2月1.2.0吉特起就开始这样做了)

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

它将变得更加完整:请参见"在Git Diff中显示阶段树和工作树?"(Git 2.3.4+,2015年第二季度):

1
git status -v -v


您可以使用此命令。

1
git diff --cached --name-only

git diff--cached选项表示获取分阶段文件,--name-only选项表示只获取文件名。


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

1
git diff --staged


使用视觉差异工具默认答案(在命令行)

这里的顶部答案正确地显示了如何查看Index中的缓存/分段更改:

1
$ git diff --cached

或者是一个别名。

而是启动Visual Diff工具

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

1
$ git difftool --staged

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

工具启动后,Git Diff脚本将暂停,直到关闭Visual Diff工具。因此,您需要关闭每个文件才能看到下一个文件。

在git命令中,可以使用difftool代替diff

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

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

1
$ git difftool -y --staged

在这种情况下,它将在VisualDiff工具中一次提取一个文件,并在工具关闭后提取下一个文件。

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

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

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

1
$ git difftool --help

设置Visual Git工具

要使用默认以外的Visual Git工具,请使用-t 选项:

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

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


用于临时区域与存储库比较

1
$git diff --staged

用于工作与存储库比较

1
$ git diff

但如果一个文件被更改并添加到临时区域($ git add fileName中),我们将尝试看到与($ git diff中的不同之处。它不会返回任何差异,因为该文件位于临时区域,并且不会与存储库进行比较。


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

本地

…进行一些更改…

1
2
3
git diff # look at unstaged changes

git commit -am"partial description of changes"

…回忆在提交中未提及的更多更改…

Git Diff源站/主服务器查看阶段性但不是推送的更改

…修改阶段提交语句…

1
2
3
git commit --amend -m"i missed mentioning these changes ...."

git push

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


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

1
2
3
$ 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

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ 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"。必须这样做:

1
2
3
4
5
6
7
8
9
10
$ 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;


git guigit-cola是图形工具,允许您查看和操作索引。这两种方法都包括对阶段文件进行简单的视觉差异处理,而git-cola还可以启动更复杂的并行视觉差异处理工具。

在Git中如何从索引中删除一个文件,可以看到我的密切相关的答案吗?以及git-gui客户机的官方目录。


想想gitk工具,它还提供了git,非常有用,可以看到这些变化。