如何显示已执行的更改?

我暂存了一些要提交的更改。我如何查看为下一次提交暂存的所有文件的差异?有没有方便的一行程序?

#0只显示暂存文件的名称,但我想看看实际的差异。

#0手册页说:

git diff[--选项] [--] […]

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

1038186 次浏览

它只应该是:

git diff --cached

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

--staged--cached不指向HEAD,只是相对于HEAD的差异。如果您选择使用git add --patch(或git add -p)提交什么,--staged将返回暂存的内容。

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

简单的Git差异

gitdiff

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

git diff--缓存

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

git diff head

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

365Git。上有更多细节

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

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

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

diffuse -m

在您的Git工作副本中。

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

另见:在git diff中显示分阶段和工作树?

请注意,git status -v显示了分阶段的更改!(这意味着您需要暂存-git add-一些更改。没有暂存更改,与git status -v没有差异。
Git 1.2.0,2006年2月开始就这样做了)

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

它即将变得更加完整:参见“在git diff中显示分阶段和工作树?”(git 2.3.4+,Q2 2015):

git status -v -v

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

本地

…做些改变…

git diff # look at unstaged changes
git commit -am"partial description of changes"

…调用提交中未提及的更多更改…

git diff的来源/主#看看分阶段但不推送的变化

…修改分阶段提交声明…

git commit --amend -m"i missed mentioning these changes ...."
git push

git guigit-cola是允许您查看和操作索引的图形实用程序。两者都包括分阶段文件的简单视觉差异,git-cola还可以启动更复杂的并行视觉差异工具。

请参阅我在如何从git中的索引中删除文件?中的密切相关的答案,以及Git-GUI客户端的官方曲库。

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

git diff --staged

考虑一下gitk工具,它提供了git,对于查看更改非常有用

您可以使用此命令。

git diff --cached --name-only

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

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

$ git diff --staged

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

对于工作与分期比较使用

$ git diff

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

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

使用视觉DIFF工具

默认答案(在命令行中)

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

$ git diff --cached

或者$ git diff --staged,这是一个别名。



启动Visual Diff工具

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

$ git difftool --staged

这将与git diff --staged相同,除了在运行diff工具时(即每次diff处理文件时),它将启动默认的可视化diff工具(在我的环境中,这是VS代码,使用code可执行文件)。

工具启动后,git diff脚本将暂停,直到您的可视化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>>

或者,有关如何配置git以使用不同的默认可视差异工具,请参阅Diff工具手册页。



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

设置扩散工具的一部分涉及更改.gitconfig文件,要么通过在幕后更改它的git命令,要么直接编辑它。

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

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

以下是我的全局用户.gitconfig中的示例条目,用于VS Code作为差异工具和合并工具:

[diff]tool = vscodeguitool = vscode[merge]tool = vscodeguitool = 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

默认情况下,gitdiff用于显示未添加到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 diffdiff --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;elseres = 2;
$ git add x/y/z.js$ git diff$

添加文件后,您不能使用默认的'git diff'。您必须这样做:-

$ git diff --cacheddiff --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;elseres = 2;

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

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

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

https://magit.vc/

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

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

例如,

git diff --staged -- app/models/user.rb