题 如何显示已上演的更改?


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

我看到了 GIT-DIFF(1) 手册页说

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

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

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


1697
2017-10-19 09:57


起源


git status -v 也有效。看到 我的答案如下 - VonC
@VonC我总是用这个,但用管道输送 less,如: git status -v | less  - 可管理的块:) - Mr Office


答案:


它应该只是:

git diff --cached

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

--staged 和 --cached 不指向 HEAD,只是差异 HEAD。如果你樱桃选择使用什么 git add --patch (要么 git add -p--staged 将返回上演的内容。


2102
2017-10-19 10:07



如果只需要文件名,请执行以下操作 git diff --name-only --cached 每个帖子 stackoverflow.com/a/4525025/255187 - Michel Hébert
使用它 git difftool --staged 而不是 git diff --staged 在每个文件上启动默认的可视化差异工具。 difftool 可以替代 diff与任何其他论点一样。 - LightCC


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

Simple Git diffs

git diff

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

git diff --cached

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

git diff HEAD

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

有更详细的信息 365Git。


1411
2017-10-24 21:05



这是天真的,我害怕(通常情况下,任何git解释)。如果你有本地修改 foo.c 而且不要表演 git add foo.c, 然后 foo.c 是 不在索引中;它不是为了提交而上演的。如果 git diff foo.c 与工作相比天真 foo.c 到索引,然后它必须显示空/不存在的文件和整个内容之间的巨大差异 foo.c。所以实际上,当索引中不存在文件时 git diff 对于该文件,使用 HEAD 复制。 - Kaz
@Kaz严格来说,指数是 不 一块空白的石板。这是一个虚拟副本 HEAD 应用分阶段更改的位置。请记住,Git通过保存更改来工作,而不是保存整个文件。暂存文件时,它只存储所做的更改。如果索引是空白的,就像你暗示的那样,它不知道如何保存索引中的更改,并且必须将整个文件保存为“新添加” - 这是错误的。 - ADTC
@Kaz这两个索引和 HEAD 将有不变的版本 foo.c 文件(它们不是物理副本,而只是您和我的逻辑副本。对于Git,它们只是与该文件所涉及的每个提交相同的数据流)。所以,当你这样做 git diff 在...上 充分 未分级 foo.c 它并没有真正回归 HEAD 它实际上正在与索引进行差异(它恰好包含与文件完全相同的文件版本) HEAD 一样)。所以图形是正确的。 - ADTC
您好,我想知道这意味着什么“指数“在这种情况下?谢谢! - Gab是好人
@Abizern那么索引是上演的变化吗? - Gab是好人


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

Screenshot of diffuse with staged and unstaged edits

用它调用它

diffuse -m

在你的Git工作副本中。

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

也可以看看: 在git diff中显示分段和工作树?


52
2018-03-18 07:22



谢谢,这看起来像一个很好的工具。到目前为止,我发现Meld是Linux上最好的视觉差异工具,但我错过了能够从剪贴板中区分文本--Meld需要文件输入。漫反射允许这种,以及手动重新对齐。会尝试一段时间。 - Drew Noakes
与diffuse.sourceforge.net的链接断开,使用 sourceforge.net/projects/diffuse 目前。 - user1133275
brew install diffuse 适用于OS X.如果未分阶段和分阶段更改,则不显示3个窗格 - 您是否表示索引中尚未进行更改? - Brent Faust
你有哪个版本的漫反射?是 - 如果您添加文件然后在本地修改它,它应该显示三个窗格。 - krlmlr
你也可以设置 扩散 作为你的默认 difftool 并使用该内置机制/工具/别名来启动它。在这里看到我的答案:<stackoverflow.com/a/45684512/6501141>; - LightCC


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

以长形式(默认), git status 有一个未记录的“详细”选项,它实际显示HEAD和索引之间的差异。

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

git status -v -v

38
2017-08-31 10:05



最后一行应该是 git diff HEAD - artur
@artur为什么?答案的要点是提到这一点 git status -vv 还包括什么 git diff HEAD 确实。 - VonC
不起作用 git version 1.8.3.1。我知道它已经过时了,但如果可能的话,请注意引入此标志的时间。 - onebree
@onebree 1.8.3.1是2013年6月,确实很老。但 git status -v 年纪大了(github.com/git/git/commit/...,git 1。2。0,2006年2月!)。请注意,它显示了之间的差异 指数 和 HEAD:如果你在索引中添加了任何东西(没有 git add), 然后 git status -v 不会显示任何差异。 git status -v -v 是最近的(Git 2。3。4,2015年3月) - VonC
@VonC这是我的错误......我做到了 git diff -v。 - onebree


您可以使用此命令。

git diff --cached --name-only

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


23
2017-07-19 17:39



请编辑更多信息。不鼓励使用仅限代码和“尝试此”的答案,因为它们不包含可搜索的内容,也不解释为什么有人应该“试试这个”。 - abarisone


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

git diff --staged

15
2017-08-14 23:33





使用可视DIFF工具

默认答案(在命令行)

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

$ git diff --cached

要么 $ git diff --staged 这是别名。


相反,启动Visual Diff工具

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

$ git difftool --staged

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

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


你总能使用 difftool 代替 diff 在git命令中

满足您所有的视觉差异需求, 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以使用其他默认的可视化差异工具。


12
2018-03-14 14:30



对于OP,我怀疑这是最好的答案。 - Matt Ruwe


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


7
2017-10-14 18:32





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

7
2018-02-25 21:16