【问题标题】:'git diff' doesn't give any output'git diff' 不提供任何输出
【发布时间】:2012-01-22 13:44:44
【问题描述】:

如果我运行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

这不会给出任何输出!

我希望看到像 + first line 这样的差异,但我什么也没得到。它没有告诉我发生了什么。 StackOverflow 上的人告诉我 git add 一些文件,所以我这样做:

$ git add .
$ git diff

还是什么都没有!

Git GUI 显示更改。

git status -v 显示更改。

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

所以我的问题是:

  1. 用简单的英语来说,git diff 是如何工作的?
  2. 如何显示我所做的所有更改(非暂存和暂存)的差异?

我公司的一些人正在使用 Git,但 SVN 人群会指出这是 Git 太混乱而无法使用的一个案例。

【问题讨论】:

  • 您确定从有效的存储库运行命令吗? MSYSGit diff 确实可以正常工作。
  • git repo 有效:git status 列出了未跟踪的更改文件,git log 工作正常。只是git diff 不起作用。我在完全不同的 repo 上的 64 位 Windows 机器上也得到了相同的结果。我是对的,不带参数的 git diff 应该显示当前文件系统状态和上次提交之间的差异?
  • 如果git status 中只有未跟踪的文件,则不会有任何更改。您能否将git status 的输出添加到您的问题中?
  • test.txt 是一个全新的文件,还是您已经将它的先前版本提交到您的 Git 存储库?
  • git 不会将文件系统上的文件视为自动包含在版本控制系统中,您必须将内容显式添加到 git 存储库中(就像您通过使用 git add . 添加当前目录所做的那样) . git diff 给出了内部版本控制的文件的变化。直到您将它们添加到版本控制中,git 将它们视为 外部,将文件视为“未跟踪”,因此在进行差异时会忽略它们...

标签: git


【解决方案1】:

根据您的git status 输出,如果没有其他参数,git diff 将不会显示任何内容。 git diff --cachedgit diff HEAD 没有什么可显示的,因为所有这些命令都依赖于 Git 已知的更改。

您没有暂存文件,也没有从现在受版本控制的文件中更改的文件。

在 Git 控制下添加 test.txt 后,您将获得所需的输出。

只需输入

git add test.txt

git add .

然后这个文件将被添加到版本控制之下。此文件的未来更改将通过git diff 显示。

【讨论】:

  • 如果我这样做 git add . 然后 git diff 我仍然没有输出。请注意, test.txt 从未提交过。如果我做git status -v,我会得到我想要的。为什么git diff 如此混乱? mercurial 和 subversion 中的 diff 命令按预期工作。有人可以用英语解释git diff 的实际作用吗?手册页英文不清楚。
  • @blokeley 我已经更新了答案的最后一段,以解决 git diff 不会显示新添加文件的更改,因为它们在您提交之前不在版本提交中。
【解决方案2】:

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

Git 不会将文件系统中的文件视为自动包含在版本控制系统中。您必须将内容显式添加到 Git 存储库中(就像您通过使用 git add . 添加当前目录一样)。

git diff 没有输出,因为 Git 没有看到您的存储库 内部 的任何更改,只有存储库 外部 的文件,它认为这些文件是“未跟踪的”并且所以在生成差异时忽略。

我发现这是与 SVN 等版本控制系统的主要区别之一(以及暂存和忽略目录)。

如果您希望包含未跟踪的文件,请git add 他们。

如果您不希望它们出现在您的存储库中,请将它们添加到您的.gitignore(请参阅git ignore --help)。这适用于 C 对象文件或 Python .pyc 文件。

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

所以这略有不同。如果您执行git status,您将看到该文件现在位于暂存区。这是您将要提交的文件的区域。

当您git add 一个新文件进入 Git 存储库时,它会跳过工作副本并直接进入暂存区域。这在某种程度上是有道理的,git add 总是将文件移动到暂存区域,无论它是否被跟踪。

要查看上次签到和暂存区之间的差异,请执行git diff --cached

要查看暂存区和工作副本之间的差异,请执行git diff。如果暂存区域中没有任何内容,则这与在上次签入和工作副本之间进行差异相同。

【讨论】:

  • 可以在命令 git reset --soft 之后。因此,不要使用数千个单词,而是使用 git diff --cached
【解决方案3】:

我见过确实应该git diff 输出但没有输出的情况;添加 --no-pagergitdiff 之间确实工作:

git --no-pager diff

...所以明确将寻呼机设置为less

git config --global core.pager 'less'

尽管less 应该是默认寻呼机。

这是在Ubuntu 12.04 LTS(精确穿山甲)中。

我找到了有关寻呼机设置的信息 the Git documentation.

【讨论】:

  • 我也可以通过 git config --global core.pager ''
  • @Kevin 我在使用基于 Mingw 的 Git 终端时遇到了这个问题,并且 less 没有按预期工作。你的解决方案为我解决了。
  • 谢谢!我一直在处理这个问题一段时间,这解决了它!我不知道设置是如何搞砸的。它以前工作过。
【解决方案4】:

这确实和寻呼机设置有关。

我发现在

中包含'-e'
export PAGER=less LESS=-cse

帮助。

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

【讨论】:

    【解决方案5】:

    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 以了解更多信息。

    【讨论】:

      【解决方案6】:

      我有一个LESS=-R 环境变量集。它使git diff 显示一个空白屏幕。

      我的解决方案:

      unset LESS
      

      【讨论】:

        【解决方案7】:

        你不需要任何额外的标志来让 git diff 工作。首先,您创建一个文件,然后使用 git add 将其添加到 git 存储库中,或者执行 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 status 应该报告该文件尚未提交。提交文件后,您将不会获得 git diff 的任何输出。即使有 --cached 标志。

        【讨论】:

          【解决方案8】:

          GIT DIFF 在 STASH 后不起作用

          在尝试像我一样应用隐藏的更改后,有人可能会遇到这种情况。

          • 存储更改
          • 移动到不同的分支并做一些工作
          • 返回 work-in-progress 分支,更新 (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,它将显示对文件的更改。

          【讨论】:

            【解决方案9】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2022-11-20
              • 2015-10-22
              • 2021-09-18
              • 2015-02-15
              • 1970-01-01
              • 2022-01-10
              • 1970-01-01
              相关资源
              最近更新 更多