"git diff"没有输出任何内容。

76

如果我运行git diff,我希望看到的是我的工作目录与之前提交的内容相比的更改列表(或者如果是一个没有提交的新存储库,则是工作目录内容的列表)。 请尝试此示例:

$ mkdir temp
$ cd temp
$ git init
$ echo "first line" > test.txt
$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       test.txt
nothing added to commit but untracked files present (use "git add" to track)

让我们来看一下test.txt的差异:

$ git diff

这段代码没有任何输出!

我期望看到像 + 第一行 这样的变化,但是实际上什么也没有。它没有告诉我发生了什么。Stack Overflow 上的人告诉我添加一些文件,所以我执行了git add操作:

$ git add .
$ git diff

仍然没有显示任何内容!

Git GUI 显示更改。

git status -v 显示更改。

但由于某些原因,git diff 没有显示任何内容。

所以我的问题是:

  1. 用简单的语言,git diff 如何工作?
  2. 如何显示我所做的所有更改的差异(未暂存和已暂存)?

我公司的一些人正在使用 Git,但 SVN 的人群会将此视为 Git 过于混乱而无法使用的案例。


Git仓库是有效的:git status列出了未跟踪的更改文件,而git log正常工作。只有git diff不起作用。我在一个完全不同的仓库上使用64位Windows机器也得到了相同的结果。我正确地认为没有参数的git diff应该显示当前文件系统状态和最后一次提交之间的差异吗? - blokeley
1
如果git status中只列出未跟踪的文件,则没有更改。您能否将git status的输出添加到您的问题中? - m0tive
test.txt是一个新文件(从未添加到git)。我以为git diff会将工作目录与索引(已暂存的更改)进行比较,但它似乎根本不这样做。看起来git diff完全忽略了任何没有使用git add添加的文件。我觉得这非常令人困惑。 - blokeley
我认为我需要做的是 git add . 然后 git status -v。但我仍然不知道 git diff 到底是干什么的。 - blokeley
1
git不会自动将文件系统中的文件视为版本控制系统中的文件,在git repo中必须显式地添加这些文件(就像您通过“ git add .”将当前目录添加到git repo中一样)。git diff列出了版本控制之内的文件更改。在将它们添加到版本控制之前,git将把文件视为在版本控制之外,并将它们视为“未跟踪”,因此在执行差异时会忽略它们... - m0tive
显示剩余2条评论
9个回答

100

为什么添加之前没有git diff输出?

Git不会自动将文件系统中的文件包含在版本控制系统中,您必须显式地将其添加到Git仓库中(通过使用git add .添加当前目录)。

git diff没有任何输出,因为Git只看到存储库外部的文件,而将其视为“未跟踪”,因此在生成差异时会忽略它们。因此,Git没有看到存储库内部的任何更改。

我发现这是与版本控制系统(如SVN)的关键区别之一(以及分期和忽略目录)。

如果要包括未跟踪的文件,请使用git add命令。

如果不想将它们添加到您的仓库中,请将它们添加到您的.gitignore文件中(请参考git ignore --help)。 这适用于C对象文件或Python的.pyc文件。

为什么添加之后没有git diff输出?!

这有些不同。 如果您运行git status,则会看到该文件现在位于暂存区中。 这是用于将要提交的文件的区域。

当您将新文件添加到Git仓库中时,它会跳过工作副本并直接进入暂存区。 从某种意义上讲,这是有道理的。无论文件是否被跟踪或未跟踪,git add始终会将其移动到暂存区。

要查看最后一次检入和暂存区之间的差异,请键入git diff --cached

要查看暂存区与当前工作副本之间的差异,请键入git diff。如果暂存区中没有任何内容,则结果相当于在最后一次检入和当前工作副本之间进行比较。


3
еҸҜд»ҘеңЁжү§иЎҢgit reset --softе‘Ҫд»ӨеҗҺдҪҝз”Ёgit diff --cachedд»ЈжӣҝеҶ—й•ҝзҡ„ж–Үеӯ—иҜҙжҳҺгҖӮ - mmike

38

我曾看到过一些情况,实际上应该从git diff中输出内容,但却没有任何输出;在gitdiff之间添加--no-pager可以解决这个问题:

git --no-pager diff

显式地使用 less 设置翻页器也是如此:

git config --global core.pager 'less'

尽管less被认为是默认的分页器。

这是在Ubuntu 12.04 LTS(Precise Pangolin)中发现的。

我在Git文档中找到了关于分页设置的信息。


3
我也通过执行 git config --global core.pager '' 命令使其正常工作。 - kvn
@Kevin,我在使用基于Mingw的Git终端时遇到了这个问题,less没有按预期工作。你的解决方案为我解决了这个问题。 - Christian Semrau
谢谢!我已经处理这个问题一段时间了,现在它被修复了!我不知道这个设置怎么会被搞乱的。以前是可以正常工作的。 - TimE

9

1. git diff如何工作?

git diff的工作原理取决于传递给它的参数。

根据参数,git diff将显示两个提交之间的更改,或提交和工作树之间的更改等等...

例如,下面将进一步介绍git diffgit diff --stagedgit diff HEAD

2. 如何显示所有更改(未暂存和已暂存)的差异?

通过同时使用git diff HEADgit diff --staged命令。

但是,在使用git init创建的存储库中,这个问题并没有实际意义,不能使用git diff HEAD:由于历史记录为空,因此没有提交和HEAD


  • git diff相对于上一次提交,仅显示跟踪文件的工作树中的更改

  • git diff HEAD相对于上一次提交,显示工作树中的更改(包括未跟踪的文件)

  • git diff --staged(或其同义词git diff --cached)相对于上一次提交,显示下一次提交的已暂存更改

有许多其他调用git diff的方法,用于比较任意提交或分支等。调用git help diff以了解更多信息。


1
git diff 显示了相对于最后一次提交的工作树中跟踪文件的更改。这是不正确的。git diff 比较的是工作树和暂存区之间的更改。查看:https://dev59.com/510b5IYBdhLWcg3wUP4X#29319403 - s.ouchene
@s.ouchene 謝謝。已更新。 - undefined

3
根据您的git status输出,没有其他参数的git diff无需显示任何内容。由于所有这些命令都依赖于Git已知的更改,因此git diff --cachedgit diff HEAD也没有要显示的内容。
现在,您没有暂存文件,也没有来自那些已受版本控制的更改文件。
当您将test.txt添加到Git控制下后,您将获得所需的输出。
只需键入
git add test.txt

或者

git add .

然后此文件将添加到版本控制中。将来对该文件所做的更改将通过 git diff 显示。


4
如果我执行 git add . 然后执行 git diff,仍然没有输出。请注意,test.txt 从未被提交过。如果我执行 git status -v 就会得到我想要的结果。为什么 git diff 如此令人困惑?在 Mercurial 和 Subversion 中的 diff 命令按照预期工作。有人能用简单易懂的英语解释一下 git diff 到底是做什么的吗?手册上的语言不够清晰明了。 - blokeley
1
@blokeley 我已经更新了我的回答的最后一段,以解决git diff不会显示新添加文件的更改的问题,因为它们还未被提交到版本控制中。 - lig

3

我设置了一个LESS=-R的环境变量,导致git diff显示空白屏幕。

解决方法:

unset LESS

1

GIT DIFF在STASH后无法工作

有些人可能会在尝试应用存储的更改后遇到这个问题,就像我一样。

  • 存储更改
  • 切换到其他分支并进行一些工作
  • 返回正在进行的工作分支,更新 (git pull) 然后使用 git stash apply(可能会出现合并冲突)
  • git diff不再起作用...

此时只需再次存储更改 (git stash),执行git pull以确保一切都是最新的(因为我对此很谨慎),仔细检查工作目录中的所有文件是否都是最新的(如果涉及远程/本地,则可能需要运行rsync),然后再次尝试使用git stash apply,它应该可以正常工作!

作为对原问题的回答,git diff没有显示任何内容是因为您有一个全新的目录,其中包含一个新添加的文件,但该文件中没有任何更改,因此git diff无法显示任何内容。git status显示您已经添加了一个新文件,但git diff用于显示文件内的更改。如果您对文件进行了更改、提交了更改,然后再次对其进行更改并运行git diff,它将显示文件的更改。

1
这确实与分页设置有关。我发现在其中包含“-e”
export PAGER=less LESS=-cse

我可以帮助。

没有使用'-e'选项,less会在第一页退出。不知何故,git在这种情况下甚至不会显示输出。


0

你不需要任何额外的标志来使git diff工作。首先,创建一个文件,并使用git add将其添加到git repo中,以进行暂存和/或执行git commit将其放入您的存储库中。现在,转到文件并对其进行更改并保存。只需在其中放置一句话,说明“我将在保存后立即运行“git diff”命令”。保存它。在这一点上,当您运行git diff命令时,您将看到差异。它将显示最近的更改,而不是执行“git commit”或者如果您最初只将文件放入暂存中。

\TestGit>git diff File2.txt
diff --git a/File2.txt b/File2.txt
index e2ba019..eff7299 100644
--- a/File2.txt
+++ b/File2.txt
@@ -6,4 +6,6 @@ File two. Which is the second file that I will NOT add with the first file File1

 The goal here is to add the File1 but not the File 2

-using git add File1.txt
\ No newline at end of file
+using git add File1.txt.
+
+So far I have just done a git add on this file.
\ No newline at end of file

带有 + 符号的行是添加的内容。如果您使用 --cached 标志并获得结果,则相同文件的 git 状态应报告该文件尚未提交。一旦您提交了该文件,即使使用 --cached 标志,也不会得到任何 git diff 输出。


0

首先,我建议在使用“git diff”命令进行更改之前,先保存您的文件。


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