git diff HEAD与git diff --staged有什么区别?


75

git diff HEAD和之间有什么区别git diff --staged?我都尝试过,但都给出相同的输出。



@Johnsyweb抱歉;“完全”相同的输出
vhd

2
--staged是的同义词--cachedstackoverflow.com/questions/1587846/…中的图表说明了区别。标记为重复
Abizern

很快(Git 2.3.4 +,2015年第二季度)git status -v -v将清楚显示两个差异之间的区别:请参阅下面的答案
VonC

Answers:


111

假设此输出为git status

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   new file:   y
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   x
#

如您所见,已经修改了一个文件,但未暂存该文件以进行提交,并且添加了一个准备提交的新文件。

git diff --staged 只会显示“暂存”区域中文件的更改。

git diff HEAD将显示对跟踪文件的所有更改。如果您已准备好所有更改进行提交,那么这两个命令将输出相同的内容。


难道不是在跟踪文件的地方是未跟踪文件吗?因为当我执行git status而不添加文件时,它会将未暂存的文件显示为未跟踪的文件。
vhd

如果它是您之前未添加的新文件,则它将显示为未跟踪,并且不会出现任何git diff变体。如果文件是之前添加和提交的,并且您已经对其进行了修改,那么它将显示为“未暂存”
CarlosCampderrós13年

是否可以diff在同一文件的暂存版本和未暂存版本之间进行更改?
Geremia

git diff --staged如果我正确理解您的意见,@ geremia会这样做。
卡洛斯·坎德罗斯

1
@CarlosCampderrós哦,是的,只要您指定文件,它将区分其暂存版本与未暂存版本。
Geremia

46
  • git diff 查看阶段目录和工作目录之间的差异
  • git diff --staged 查看HEAD和Stage之间的差异
  • git diff HEAD 查看HEAD和工作目录之间的差异

在此处输入图片说明
img src

在此处输入图片说明 在此处输入图片说明
img src

  • origin 指从中克隆源的源存储库。
  • HEAD 是对当前已检出分支中最后一次提交的引用。
  • 分段和索引都相同
  • 我们的工作目录中存在未暂存的更改,但是Git尚未将其记录到其版本历史中。
  • 暂存的更改与未暂存的更改非常相似,不同之处在于已将它们标记为下次运行git commit时已提交

17
最佳图片对我很有帮助。较低的图形没有那么多。
尼克·韦弗斯

@NickWeavers我删除了图形,因为它们很分散注意力,并且没有增加答案。
Episodeyang

任何人都不知道使用了什么工具来创建顶部图形?
creativemateriel

1
@creativemateriel我想用TikZ:overleaf.com/learn/latex/TikZ_package
01F0

8

随着即将到来,您将能够更轻松地看到两个差异之间的差异(Git 2.3.4 +,2015年第二季度) git status -v -v

犯4055500迈克尔·格鲁伯Ĵmjg,它很好地解释之间的区别git diff HEADgit diff --staged

commit/ status:显示index-worktree diff与-v -v

git commitgit status以长格式显示给定时HEAD与索引之间的差异-v。这允许预览要进行的提交

他们还列出了具有未暂存更改但没有差异的跟踪文件。

介绍“ -v -v”示出的索引和worktree之间的差异除了HEAD索引DIFF。这样可以检查未提交的更改,这些更改可能会在提交中丢失

如果是' -v -v',则附加标题行

Changes to be committed:
# and
Changes not staged for commit:

插入在差异之前,与状态部分中的相同;后者前面加上50 *“ -”,以使其更加突出。


1

另一个极端的区别:在新创建的git repo中,git init到目前为止仅运行了此仓库,git diff HEAD将导致致命错误(模糊参数“ HEAD”),而git diff --staged不会产生任何输出。


0

如果您在不成功的合并(即未合并的路径)上运行两个diff命令,则也可以从两个diff命令获得不同的输出。

我无法找出为什么会这样,但是您可以在此处阅读更多内容

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.