如何显示已进行的更改?


2136

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

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

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

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

不幸的是,我对此不太理解。必须有一些方便的单行代码,我可以为其创建别名,对吗?


76
git status -v也可以。请在下面
VonC 2015年

3
@VonC我一直使用它,但是通过管道将其传递给less,例如:git status -v | less–可管理的块:)
Office先生

Answers:


2606

应该只是:

git diff --cached

--cached表示相对于当前缓存/索引的更改(即分段更改)HEAD--staged是的同义词--cached

--staged--cached没有指出HEAD,只是关于差异HEAD。如果您使用git add --patch(或git add -p)选择要提交的内容,--staged则将返回已暂存的内容。


35
如果你只想要的文件名,请执行下列操作git diff --name-only --cached每个职位在stackoverflow.com/a/4525025/255187
米歇尔·赫伯特

4
将此与配合使用,git difftool --staged而不是git diff --staged在每个文件上启动默认的视觉差异工具。 difftool也可以diff用其他任何参数替换。
LightCC '17

您可以用来git difftool --staged -d在可视化工具中区分两个目录,而不是一次比较一个文件。
罗伯特·伯恩斯坦

由于此标记为答案并显示为第一个,因此应该在顶部包括git diff,然后是git [[others]],仅是我的2美分
Vitaliy Terziev,

要查看单个暂存文件中的更改,请执行以下操作:git diff --cached -- <stagedfile>
ObviousChild

1603

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

简单的Git差异

git diff

显示工作目录和索引之间的更改。这显示了已更改但未上演提交的内容。

git diff-缓存

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

git diff头

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

另外

365Git上有更多细节


8
恐怕这太天真了(就像任何git解释一样)。如果你有本地修改foo.c和不执行git add foo.c,那么foo.c不是在指数 ; 它没有上演提交。如果git diff foo.c天真地将其foo.c与索引的工作进行比较,则它必须显示空文件/不存在的文件与的全部内容之间的巨大差异foo.c。因此,实际上,当索引中不存在文件时git diff,对于该文件,将使用HEAD副本进行后退。
卡兹(Kaz)2014年

9
严格来说,@ Kaz,索引不是空白。它是HEAD已应用阶段更改的虚拟副本。请记住,Git通过保存更改而不是通过保存整个文件来工作。暂存文件时,它仅存储所做的更改。如果索引是空白的(如您所暗示的那样),它将不知道如何保存索引中的更改,并且必须将整个文件另存为“新添加”-这是错误的。
ADTC

8
@Kaz索引和HEAD都将具有foo.c文件的不变版本(它们不是物理副本,而只是您和我的逻辑副本。对于Git,它们只是与该文件涉及的每个提交所引用的相同的数据流。 )。所以,当你做git diff完全不分阶段foo.c它不是真正回落到HEAD它实际上做与指数的差异(这恰好包含的文件完全相同的版本HEAD一样)。因此,图形是正确的。
ADTC

2
您好,我想知道在这种情况下“ 索引 ” 是什么意思?谢谢!
Gab是好人2016年

2
@TomRussell git status -v相当于git diff --cachedgit status当然还有)
wisbucky

54

如果您对可视并排视图感兴趣,可以使用“ 漫反射视觉差异”工具。如果已执行部分但不是全部更改,它甚至将显示三个窗格。在发生冲突的情况下,甚至会有四个窗格。

带有阶段性和非阶段性编辑的diffuse屏幕截图

调用

diffuse -m

在您的Git工作副本中。

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

另请参阅:在git diff中显示暂存树和工作树?


1
谢谢,这看起来像一个不错的工具。到目前为止,我发现Meld是Linux上最好的可视化差异工具,但我错过了能够从剪贴板差异化文本的功能-Meld需要输入文件。漫反射允许这种情况,以及手动重新对齐。会尝试一段时间。
Drew Noakes

链接到diffuse.sourceforge.net的链接已断开,现在使用sourceforge.net/projects/diffuse
user1133275 2015年

1
brew install diffuse可以在OS X上使用。如果未暂存和暂存的更改都不会显示3个窗格-您是说索引中还没有更改吗?
布伦特浮士德

您有哪个版本的diffuse?是的-如果您添加文件然后在本地对其进行修改,则该文件应显示三个窗格。
krlmlr

您还可以将diffuse设置为默认的difftool,并使用该内置机制/工具/别名启动它。在这里查看我的答案:< stackoverflow.com/a/45684512/6501141 >
LightCC '18

50

请注意,这git status -v 显示了阶段性的更改!(这意味着您需要上演--进行git add一些更改。没有上演的更改,没有diff区别git status -v
2006年2月Git 1.2.0起执行此操作)

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

而且它将变得更加完整:请参阅“ 在git diff中同时显示已上演和正在工作的树? ”(git 2.3.4 +,2015年第二季度):

git status -v -v

最后一行应该是git diff HEAD
artur

2
@artur为什么?答案的重点是要提到git status -vv它还包括什么git diff HEAD
VonC

不起作用git version 1.8.3.1。我知道它已经很旧了,但如果可能的话,请注意何时引入此标志。
onebree 2015年

2
@onebree 1.8.3.1确实是2013年6月。但是git status -v比较老(github.com/git/git/commit/…,git 1.2.0,2006年2月!)。请注意,它显示索引和之间的差异HEAD:如果您向索引添加了任何内容(no git add),则git status -v不会显示任何差异。git status -v -v是最近的版本(Git 2.3.4,2015
VonC

@VonC那是我的错误...我做到了git diff -v
6

25

您可以使用此命令。

git diff --cached --name-only

--cached的选择git diff手段来获得筹备的文件,并--name-only选择手段,只得到文件名。


2
请编辑更多信息。不建议使用纯代码和“尝试此”答案,因为它们不包含可搜索的内容,并且不解释为什么有人应该“尝试此”。
abarisone

2
不知道为什么要这么做,--name-only我可以选择使用常规选项git status
Simon Forsberg,

16

从1.7版本开始,应该是:

git diff --staged

15

使用视觉差异工具

默认答案(在命令行)

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

$ git diff --cached

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


而是启动Visual Diff工具

默认答案将在git bash上吐出diff更改(即在命令行或控制台上)。对于那些希望以可视化方式显示暂存文件差异的用户,git中提供了一个脚本,该脚本为每个查看的文件启动可视化diff工具,而不是在命令行上显示它们,称为difftool

$ git difftool --staged

这样做与相同git diff --staged,不同之处在于,只要运行diff工具(即每次使用diff处理文件),都会启动默认的视觉diff工具(在我的环境中,这是kdiff3)。

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


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

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

例如,要启动可视化差异工具而无需询问是否对每个文件执行此操作,请添加-y选项(我想通常您会希望这样做!):

$ git difftool -y --staged

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

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

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

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

$ git difftool --help


设置Visual 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

14

对于暂存区与存储库(最后提交)的比较,请使用

 $git diff --staged

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

对于工作与登台比较,请使用

$ git diff 

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

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


“对于工作与存储库比较,请使用$ git diff。我很确定git diff在工作与暂存之间进行比较。参见stackoverflow.com/a/1587952
wisbucky

8

如果您打算将目标推送到远程回购分支,并且您在提交更改日志中的第一遍操作不完整,则可以像这样在推送之前更正提交语句。

在本地

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

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


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;


0

还考虑一下gitkgit提供的工具,它对于查看更改非常有用

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.