git diff没有输出


git diff gives no output

如果我运行git diff,我希望看到我的工作目录相对于以前提交的内容所做的更改的列表(如果是没有提交的新repo,则会看到工作目录内容的列表)。试试这个例子:

1
2
3
4
5
6
7
8
9
10
11
$ 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的差异:

1
$ git diff

这没有输出!

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

1
2
$ git add .
$ git diff

还是什么都没有!

Git GUI显示更改。

git status -v显示了这些变化。

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

所以我的问题是:

  • 用简单的英语来说,git diff是如何工作的?
  • 如何显示我所做的所有更改的差异(未分级和分阶段)?
  • 我公司的一些人正在使用Git,但是SVN的人群将把这一点作为Git太混乱而无法使用的一个例子。


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

    Git不会将文件系统上的文件视为自动包含在版本控制系统中,您必须将内容显式添加到Git存储库中(正如您使用git add .添加当前目录所做的那样)。

    没有输出到git diff,因为Git在您的存储库中看不到任何更改,只看到存储库外部的文件,它认为这些文件是"未跟踪的",因此在生成diff时会忽略这些文件。

    我发现这是像SVN这样的VCS的一个关键区别(以及分段和忽略目录)。

    如果您希望包含未跟踪的文件,则为git add个。

    如果你不想在你的回购中加入他们,把他们加入你的.gitignore(见git ignore --help)。这适用于C对象文件或python .pyc文件。

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

    所以这有点不同。如果执行git status,您将看到文件现在在临时区域中。这是您将要提交的文件区域。

    当你在git repo中输入一个新文件时,它跳过工作副本直接进入临时区域。这在某种程度上是有意义的,无论文件是被跟踪的还是未跟踪的,git add总是将文件移动到临时区域。

    要查看最后一次登记和临时区域之间的差异,请执行git diff --cached

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


    我曾经看到过这样的情况:确实应该从git diff中输出,但没有;补充在gitdiff之间的--no-pager起作用:

    1
    git --no-pager diff

    …所以显式地将寻呼机设置为less,使用

    1
    git config --global core.pager 'less'

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

    这是在Ubuntu 12.04 LTS。我只是想补充一下,以防其他有同样问题的人来寻求解决方案,而上面的问题没有回答。

    我在Git文档。


    1.How, in plain English, does git diff work?

    git diff的工作方式取决于传递给它的参数。

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

    例如,git diffgit diff --stagedgit diff HEAD将在下面进一步描述。

    2.How can I show a diff of all the changes I've made (unstaged and staged)?

    通过使用命令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了解更多信息。


    根据您的git status输出,没有额外的参数,git diff没有显示任何内容。对于git diff --cachedgit diff HEAD,没有什么可以显示的,因为所有这些命令都依赖于git已知的更改。

    您没有阶段文件,也没有来自那些现在处于版本控制下的文件的更改文件。

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

    只是类型

    1
    git add test.txt

    1
    git add .

    此文件将在版本控制下添加。这个文件的未来更改将由git diff显示。


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

    我的解决方案:

    1
    unset LESS

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

    我发现包括"e"在内

    1
    export PAGER=less LESS=-cse

    帮助。

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


    Git diff不需要任何其他标志即可工作。首先,您创建一个文件,并使用git add to staging将其添加到git repo中,或者执行git commit将其放入存储库中。现在,转到该文件并对其进行更改并保存它。只需在其中放一句话,说明"我将在保存后立即运行"git diff"命令。保存它。此时,运行git diff命令时,您将看到不同之处。它将在执行"git commit"之前显示最近所做的更改,或者如果您最初只是将文件放入临时文件中,那么它将显示最近所做的更改。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    \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标志并获得result,那么同一文件的git状态应该报告该文件尚未提交。一旦提交了该文件,即使使用--cached标志,也不会得到git diff的任何输出。