如何显示已上演的更改?

时间:2009-10-19 09:57:27

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

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

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

  

git diff [--options] [ - ] [...]

     

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

不幸的是,我无法理解这一点。必须有一些方便的单行,我可以创建一个别名,对吗?

15 个答案:

答案 0 :(得分:2350)

应该是:

git diff --cached

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

--staged--cached未指向HEAD,仅与HEAD有所不同。如果您使用git add --patch(或git add -p)来挑选提交内容,--staged将返回上演的内容。

答案 1 :(得分:1501)

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

Simple Git diffs

git diff

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

git diff --cached

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

git diff HEAD

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

同时

有关365Git.

的详细信息

答案 2 :(得分:52)

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

Screenshot of diffuse with staged and unstaged edits

调用它
diffuse -m

在你的Git工作副本中。

如果你问我,十年来我见过的最佳视觉效果。此外,它不是特定于Git:它与许多其他VCS互操作,包括SVN,Mercurial,Bazaar,......

另请参阅:Show both staged & working tree in git diff?

答案 3 :(得分:46)

请注意,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年第2季度):

git status -v -v

答案 4 :(得分:25)

您可以使用此命令。

git diff --cached --name-only

--cached git diff选项意味着获取暂存文件,--name-only选项意味着只获取文件名称。

答案 5 :(得分:16)

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

git diff --staged

答案 6 :(得分:14)

使用可视DIFF工具

默认答案(在命令行中)

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

$ git diff --cached

$ git diff --staged这是别名。


改为启动Visual Diff工具

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

$ git difftool --staged

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

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


您始终可以使用difftool代替git命令中的diff

对于您的所有视觉差异需求,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以使用不同的默认视觉差异工具。

答案 7 :(得分:9)

对于临时区域与存储库比较,请使用

sjp.lmer(model, 
     type = "re", 
     sort.est = "sort.all", 
     facet.grid = F,
     axis.title = c("IV Title", "DV Title"))

对于工作与存储库比较,请使用

$git diff --staged

但如果文件已更改并添加到暂存区域($ git diff ),我们会尝试查看($ git add fileName)的差异。它不会返回任何差异,因为文件位于暂存区域,并且不会与存储库进行比较。

答案 8 :(得分:8)

如果您的意图是推送目标远程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

答案 9 :(得分:7)

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

答案 10 :(得分: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
$

添加文件后,您无法使用默认的&#39; git diff&#39;你必须这样做: -

$ 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;

答案 11 :(得分:2)

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

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

答案 12 :(得分:0)

还可以考虑使用git提供的gitk工具,这对于查看更改非常有用

答案 13 :(得分:0)

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

git diff origin/<branch>..<branch>做到了。

答案 14 :(得分:0)

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

https://magit.vc/