如何显示已上演的更改?

Frerich Raabe 2034 git diff dvcs git-diff git-stage

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

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

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

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

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

CB Bailey.. 2491

它应该只是:

git diff --cached

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

--staged--cached没有指出HEAD,只是差异HEAD.如果你选择使用git add --patch(或git add -p)提交什么,--staged将返回上演的内容.

  • 如果您只想要文件名,请在http://stackoverflow.com/a/4525025/255187上的每篇文章中执行以下`git diff --name-only --cached` (32认同)
  • 使用`git difftool --staged`而不是`git diff --staged`来启动每个文件的默认视觉差异工具.`difftool`也可以用任何其他参数替换`diff`. (3认同)

Abizern.. 1546

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

简单的Git差异

git diff

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

git diff --cached

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

git diff HEAD

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

另外:

有关365Git的更多细节.

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

krlmlr.. 52

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

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

用它调用它

diffuse -m

在你的Git工作副本中.

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

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


VonC.. 49

注意,git status -v 显示了分阶段的变化!(意思是你需要上演 - git add一些变化.没有上演的变化,没有差异git status -v.
2006年2月Git 1.2.0以来就这样做了)

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

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

git status -v -v

  • @artur为什么?答案是要提到`git status -vv`还包括`git diff HEAD`所做的事情。 (2认同)
  • @onebree 1.8.3.1是2013年6月,确实很老.但是`git status -v`更旧(https://github.com/git/git/commit/cf7bb589af739563c90dc32b4901bea73aaaa9d0,git 1.2.0,2006年2月!).请注意,它显示**index**和`HEAD`之间的差异:如果你在索引中添加了任何东西(没有`git add`),那么`git status -v`就不会显示任何差异.`git status -v -v`是最近的(Git 2.3.4,2015年3月) (2认同)

小智.. 24

您可以使用此命令.

git diff --cached --name-only

--cached的选择git diff手段来获得上演文件和--name-only选项表示只得到文件名.

  • 请编辑更多信息.不鼓励使用仅限代码和"尝试此"的答案,因为它们不包含可搜索的内容,也不解释为什么有人应该"试试这个". (2认同)

小智.. 16

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

git diff --staged


LightCC.. 14

使用可视的DIFF工具

默认答案(在命令行)

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

$ git diff --cached

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


相反,启动Visual Diff工具

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

$ git difftool --staged

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

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


您始终可以使用git命令difftool代替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以使用其他默认的可视化差异工具.


Goyal Vicky.. 12

对于Staging Area vs Repository比较使用

 $git diff --staged

对于Working vs Repository比较使用

$ git diff 

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


Marc Condon.. 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


Fred Schoen.. 7

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


小智.. 6

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

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


归档时间:

查看次数:

784595 次

最近记录:

1 年,3 月 前