如何查看工作目录和暂存区之间的差异?

30

我们可以通过以下方式看出代码仓库和工作目录的区别:

git diff

我们可以通过以下方式区分存储库和暂存区:

git diff --staged

但是我们如何区分工作目录和暂存区之间的差异呢?

3个回答

52

实际上,git diff 是在索引和工作树之间进行比较。只有当你使用git add将更改添加到索引中时,它的内容才与HEAD提交相同。

git diff HEAD 则是在仓库和工作树之间进行比较。

请参见365git.tumblr.com post

git diffs


2
默认情况下,@matori82,索引等于存储库。只有在开始向其添加文件时,索引才会与存储库不同。 - VonC
啊...我不知道这个。看来我得更深入地了解git的内部机制才能获取这样的信息...谢谢。 - matori82
然而,这个命令的逻辑似乎更加复杂。例如,如果我在索引中有一个文件和一个修改后的文件在工作目录中,当我执行“git diff”时,差异会显示在工作目录中的文件上,但是暂存区中的文件差异根本没有显示!现在真的非常困惑... - matori82
1
@matori82 这是预期的行为:git diff 的目标是默认显示尚未被跟踪(添加到索引或提交)的内容。您已经将其添加到索引中,因此默认情况下不再显示它,因为您已经审查过并决定将其作为下一次提交的一部分。 - VonC
@matori82 确定:https://dev59.com/qHA65IYBdhLWcg3wrgoa#3690796。当您刚提交时,索引等于存储库。然后,您开始`git add文件(索引与存储库不同,并且git diff`仅会显示未添加到索引的文件或文件部分)。然后您提交,索引再次等于存储库。 - VonC
显示剩余3条评论

12
  • git diff - 比较工作区与暂存区之间的差异。
  • git diff --staged - 比较暂存区与版本库之间的差异。
  • git diff HEAD - 比较工作区与版本库之间的差异。

为了说明这一点,我将一个文件更改为“Name Staged”并添加到暂存区(git add .),然后再次更改该文件,现在我将文本替换为“Name Working Area”,然后运行以下命令:

enter image description here

现在你可以清楚地看到它是如何工作的。很酷吧?


1
受@VonC的采纳答案启发,您可以使用以下方式替代git diff HEAD:
git difftool --dir-diff --no-prompt HEAD

这将打开一个目录差异,显示你的工作目录和repo之间的差异。从那里开始查看单个文件的更改非常容易(例如使用类似Beyond Compare带有选项卡UI的工具)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接