Git diff HEAD vs --staged

时间:2013-05-15 10:01:56

标签: git

git diff HEADgit diff --staged之间有什么区别?我试过了两个但都给出了相同的输出。

5 个答案:

答案 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与工作目录之间的区别

enter image description here
img src

enter image description here enter image description here
img src

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

答案 2 :(得分:5)

您将能够更轻松地看到两种差异与升级之间的区别(Git 2.3.4 +,2015年第2季度) git status -v -v

请参阅commit 4055500中的Michael J Gruber mjg,它可以很好地解释git diff HEADgit diff --staged之间的区别:

  

commit / status:显示带有-v -v

的index-worktree差异      长格式的

git commitgit 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 initgit diff HEAD会导致致命错误(模糊参数'HEAD'),而{{1 }}将不会产生任何输出。