git diff没有输出

时间:2011-12-17 10:52:31

标签: git

如果我运行git diff,我希望看到我的工作目录相对于之前提交的任何内容的更改列表(或者工作目录内容的列表,如果它是一个没有提交的新repo)。试试这个例子:

$ 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. 如何展示我所做的所有更改(未分期和上演)的差异?
  3. 我公司的一些人正在使用git,但是SVN人群会指出这是git太混乱无法使用的情况。

9 个答案:

答案 0 :(得分:63)

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

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

git diff没有输出,因为git看不到您的存储库中 的更改,只有文件 存储库,它认为“未跟踪”等等在生成差异时忽略。

我发现这与vcs的关键区别之一就像svn一样(以及暂存和忽略目录)。

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

如果您不想在回购邮件中将其添加到.gitignore(请参阅git ignore --help)。这适用于C对象文件或python .pyc文件。

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

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

当您将git add新文件放入git repo时,它会跳过工作副本并直接进入暂存区域。这在某种程度上是有道理的,git add始终将文件移动到临时区域,无论是跟踪还是未跟踪。

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

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

答案 1 :(得分:25)

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

git --no-pager diff

...使用

明确将寻呼机设置为less
git config --global core.pager 'less'

即使less应该是默认的寻呼机。

这是在Ubuntu 12.04 LTS中。我只是添加这个以防其他有相同问题的人来寻找解决方案而且上面没有回答这个问题。

我找到了有关寻呼机设置的信息 the git docs

答案 2 :(得分:3)

根据您的git status输出,没有其他参数,git diff无法显示任何内容。 git diff --cachedgit diff HEAD没有显示任何内容,因为所有这些命令都依赖于git已知的更改。

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

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

输入

git add test.txt

git add .

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

显示

答案 3 :(得分:3)

  

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

答案 4 :(得分:2)

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

我的解决方案:

unset LESS

答案 5 :(得分:1)

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

我发现在

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

帮助。

如果没有'-e',less将退出第一页。 在某种程度上,git甚至不会在这种情况下显示输出。

答案 6 :(得分:1)

存储后无法使用Git差异

有人像我一样尝试应用隐藏的更改后可能会遇到此问题。

  • 隐藏更改
  • 移至其他分支并进行一些工作
  • 返回进行中的分支,先更新(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,它将向您显示对该文件的更改。

答案 7 :(得分:0)

您不需要任何其他标志即可使git diff起作用。首先,您创建一个文件,并将其添加到git repo中,并使用git add进行登台,或者执行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状态应报告该文件尚未提交。提交文件后,将不会获得git diff的任何输出。即使带有--cached标志。

答案 8 :(得分:0)

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