git diff HEAD
和git diff --staged
之间有什么区别?我试过了两个但都给出了相同的输出。
答案 0 :(得分:75)
假设此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
将显示所跟踪文件的所有更改。如果您为提交暂存所有更改,则两个命令都将输出相同的内容。
答案 1 :(得分:15)
git diff
查看舞台与工作目录之间的区别git diff --staged
查看HEAD和Stage git diff HEAD
查看HEAD与工作目录之间的区别origin
指的是克隆它的源存储库。 HEAD
是对当前签出分支中最后一次提交的引用。 答案 2 :(得分:5)
您将能够更轻松地看到两种差异与升级之间的区别(Git 2.3.4 +,2015年第2季度) git status -v -v
请参阅commit 4055500中的Michael J Gruber mjg
,它可以很好地解释git diff HEAD
和git diff --staged
之间的区别:
的index-worktree差异 长格式的
commit
/status
:显示带有-v -v
git commit
和git status
显示HEAD之间的差异 给定-v
时的索引。这允许预览提交。他们还列出了带有非分段更改的跟踪文件,但没有差异。
介绍'
-v -v
',它显示了索引和。之间的差异 worktree 另外到HEAD
索引差异。这允许审查提交中可能缺少的未分级更改。如果是“
-v -v
”,则会有其他标题行
Changes to be committed:
# and
Changes not staged for commit:
在差异之前插入,它们等于状态部分中的那些;后者以50 *“
-
”开头,以使其更加突出。
答案 3 :(得分:0)
如果在不成功的合并(即未合并的路径)上运行它们,也可以从两个diff命令获得不同的输出。
我无法找出原因,为什么会这样,但你可以详细了解here
答案 4 :(得分:0)
另一个极端情况是:在一个新创建的git repo中,到目前为止仅运行git init
,git diff HEAD
会导致致命错误(模糊参数'HEAD'),而{{1 }}将不会产生任何输出。