git diff HEAD
和 和有什么不一样git diff --staged
?我都试过了,但都给出了相同的输出。
5 回答
假设此输出为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 diff
查看阶段和工作目录之间的区别git diff --staged
查看 HEAD 和 Stage 之间的区别git diff HEAD
查看 HEAD 和工作目录之间的区别
HEAD
是对当前签出分支中最后一次提交的引用。- 暂存区、舞台、索引都是同一个意思
- 我们的工作目录中存在未暂存的更改,但 Git 尚未将它们记录到其版本历史记录中。
- 分阶段的更改很像非分阶段的更改,只是它们已被标记为在您下次运行 git commit 时提交
随着即将到来的(Git 2.3.4+,Q2 2015),您将能够更容易地看到这两个差异之间的区别git status -v -v
请参阅Michael J Gruber的提交 4055500,它很好地解释了和之间的区别:mjg
git diff HEAD
git diff --staged
commit
/status
:显示索引工作树差异-v -v
git commit
并git status
以长格式显示 HEAD 和给定索引之间的差异-v
。这允许预览要进行的提交。他们还列出了具有未暂存更改但没有差异的跟踪文件。
引入 ' ',它除了显示索引差异外,还显示
-v -v
了索引和工作树之间的差异。这允许审查提交中可能缺少的未暂存更改。HEAD
在 '
-v -v
' 的情况下,附加标题行
Changes to be committed:
# and
Changes not staged for commit:
插入到差异之前,与状态部分中的差异相同;后者前面有 50*"
-
" 以使其更加突出。
另一个极端情况的区别:在一个新创建的 git repo 中,git init
到目前为止只运行过,git diff HEAD
将导致致命错误(不明确的参数 'HEAD'),而git diff --staged
不会产生任何输出。
如果您在不成功的合并(即未合并的路径)上运行这两个 diff 命令,您还可以获得不同的输出。
我无法找出它为什么会这样,但你可以在这里阅读更多关于它的信息