88

git diff HEAD和 和有什么不一样git diff --staged?我都试过了,但都给出了相同的输出。

4

5 回答 5

127

假设此输出为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将显示对跟踪文件的所有更改。如果您已将所有更改暂存以进行提交,则两个命令将输出相同的内容。

于 2013-05-15T10:35:13.600 回答
65
  • git diff查看阶段和工作目录之间的区别
  • git diff --staged查看 HEAD 和 Stage 之间的区别
  • git diff HEAD查看 HEAD 和工作目录之间的区别

在此处输入图像描述
图片来源

  • HEAD是对当前签出分支中最后一次提交的引用。
  • 暂存区、舞台、索引都是同一个意思
  • 我们的工作目录中存在未暂存的更改,但 Git 尚未将它们记录到其版本历史记录中。
  • 分阶段的更改很像非分阶段的更改,只是它们已被标记为在您下次运行 git commit 时提交
于 2017-12-06T22:59:46.967 回答
9

随着即将到来的(Git 2.3.4+,Q2 2015),您将能够更容易地看到这两个差异之间的区别git status -v -v

请参阅Michael J Gruber的提交 4055500,它很好地解释了和之间的区别:mjggit diff HEADgit diff --staged

commit/ status:显示索引工作树差异-v -v

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

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

引入 ' ',它除了显示索引差异外,还显示-v -v了索引和工作树之间的差异。这允许审查提交中可能缺少的未暂存更改HEAD

在 ' -v -v' 的情况下,附加标题行

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

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

于 2015-03-18T07:35:26.413 回答
2

另一个极端情况的区别:在一个新创建的 git repo 中,git init到目前为止只运行过,git diff HEAD将导致致命错误(不明确的参数 'HEAD'),而git diff --staged不会产生任何输出。

于 2020-06-01T02:20:06.397 回答
1

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

我无法找出它为什么会这样,但你可以在这里阅读更多关于它的信息

于 2016-12-13T14:55:17.540 回答