为什么`git diff`报告`git add`后没有文件更改

时间:2014-09-30 17:43:08

标签: git git-diff git-add

为什么git diff认为没有变化

..即使git status将其报告为已修改

$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   file-added
    modified:   file-with-changes   << it knows there are changes

但是为了看到差异,我需要显式添加最后一个reversion哈希..

$ git diff
  (nothing)

$ git diff rev-hash
diff --git a/file-with-changes b/file-with-changes
index d251979..a5fff1c 100644
--- a/file-with-changes
+++ b/file-with-changes
.
..

4 个答案:

答案 0 :(得分:29)

请尝试git diff --staged命令。

您可以使用更多选项。

  

git diff

显示索引/暂存和工作文件之间的更改。在您的情况下,git addfile-with-changes放入暂存区域。因此,登台和工作文件之间没有区别。

  

git diff --staged

显示HEAD和索引/暂存之间的变化。 git diff --cached也做了同样的事情。 stagedcached可以互换使用。

  

git diff HEAD

显示HEAD和工作文件之间的变化

  

git diff $commit $commit

显示2次提交之间的更改

  

git diff origin

显示HEAD和&amp;之间的差异。远程/起源

答案 1 :(得分:5)

git diff针对索引进行区分,而不是针对HEAD修订版。通过运行git add,您已将更改添加到索引中,因此当然没有差异!使用

  • git diff HEAD查看您的树状态与HEAD修订版之间的差异,或
  • git diff --cached查看您的索引与HEAD修订版之间的差异。

答案 2 :(得分:1)

进入完全相同的问题。

  • 添加使用git add filename1.c
  • 创建的新文件
  • 对已经是存储库跟踪系统一部分的其他filename2.c进行另一次更改。
  • 执行git diff,你只会看到对filename2.c的更改。对filename1.c的更改不会显示。
  • 但是,如果您执行git状态,您将看到filename1.c和filename2.c中的更改都显示出来。
  • 执行git commit -a -m&#34;对filename1.c和filename2.c的更改blah blah&#34;
  • 做一个git push

您将看到filename1.c已提交。

答案 3 :(得分:0)

因为默认情况下git diff会检查暂存区域和工作副本之间的差异。当您git add时,您的临时区域与您的工作副本相匹配,因此差异报告不会发生任何变化。

添加--cached标志会告诉diff对HEAD的差异。