【问题标题】:Understanding what git diff does了解 git diff 的作用
【发布时间】:2020-06-16 20:14:24
【问题描述】:

我从git diff 的手册页中读到它应该返回“工作树中的更改尚未为下一次提交暂存”。如果我了解工作树是什么(它应该是您的本地 git repo 工作文件夹),当我将一个新文件添加到我的工作目录时,我应该会看到它由 git diff 返回,但它什么也没返回。我没有得到什么?

【问题讨论】:

  • 你把那个新文件添加到 git 了吗? 是否包含任何更改?
  • 干得好@jonrsharpe 我添加到工作树中的文件确实都是空的,一旦它们有任何内容,它们就会被git diff正确返回

标签: git


【解决方案1】:

这与大小无关。它与 git 如何“看到”以及您要求的区别有关。

  • 首先,有三个地方:HEAD(最近的提交)、索引(你add 到的位置)和工作树。所以有两个“简单的差异”命令:

    • git diff 询问索引和工作树之间的区别。
    • git diff --cached 询问 HEAD 和 index 之间的区别。
  • 其次,对于 git 而言,HEAD 中没有的内容或索引不存在;它是“未跟踪的”。

如果一个文件被跟踪(它在索引或 HEAD 中),那么工作树中但不在索引中的更改是unstaged。但是,如果一个文件没有被跟踪,那么工作树中的变化是untracked;它们还没有达到未上演的水平,它们不会处于任何一种差异中。

好的。所以当你第一次创建一个文件时,不管它有没有大小,它根本不在 git 的权限范围内(它是未跟踪的),所以它不是 any diff 的一部分:

$ touch Z # this one has no size
$ echo testing > ZZ # this one has size
$ git diff # (crickets...)
$ git diff --cached # (crickets...)

然后当你 add 那个文件时,现在 git 知道它(它被跟踪)。索引和工作空间之间仍然没有差异,因为索引与工作空间相同;您只是将这些文件从后者复制到前者!但是现在 HEAD 和索引之间的区别确实存在:

$ git add .
$ git diff # (crickets...)
$ git diff --cached
diff --git a/Z b/Z
new file mode 100644
diff --git a/ZZ b/ZZ
new file mode 100644

好的,现在这些文件 在 git 的监督下,因为它们在索引中。所以现在如果我们对其中一个进行更改(在工作树中),那么索引和工作树之间会有差异(未分级):

$ echo testing2 >> ZZ
$ git diff
diff --git a/ZZ b/ZZ
--- a/ZZ
+++ b/ZZ
@@ -1 +1,2 @@
 testing
+testing2

反过来也是一样。为了说明我的意思,我将添加并提交所有内容;现在没有简单的差异,正如预期的那样:

$ git add .
$ git commit -m'xxxx'
$ git diff # (crickets...)
$ git diff --cached # (crickets...)

现在我将从索引中删除ZZ,使用rm,从HEAD中删除,使用commit

$ git rm --cache ZZ
rm 'ZZ'
$ git commit -m'removed'

现在,索引和工作树之间再一次没有区别,即使文件 ZZ 仍在工作树中:

$ git diff # (crickets...)
$ ls
Z   ZZ

这是因为,由于 ZZ 不再位于 HEAD 或工作树中,它再次未被跟踪;它再次不在 git 的权限范围内。

【讨论】:

  • 文件未显示,因为它们是 0 字节文件。一旦他们的尺寸> 0,他们就开始被git diff返回
  • 不,这是一个红鲱鱼的想法。这不是大小。这是您是否曾经添加过该文件。即使您将touch Z 替换为echo testing > Z,我的示例也一样。请注意,在我的示例的第二部分中,即使没有大小,也会存在差异。
  • @whatever 我修改了我的答案以证明它与git add 有关,与“大小”无关。
  • 我迷路了。 git diff 不应该显示发生了什么变化(在工作树中)但尚未通过 git add 添加到索引中?
  • 在第三个例子中,是的。但那是因为 文件本身 的副本已经在索引中。你有看到?如果文件不在 HEAD 中且不在索引中,则它是未跟踪的,git diff 看不到它。 git status 报告它,但它不在 git 的控制范围内,所以它不在 git diff 中。
【解决方案2】:

一旦你添加了一个文件(如I add it to index,当我们说我们添加与 git 相关的东西时我们通常的意思),它会进入staged for next commit 状态,因此它将远离@ 987654324@ 默认。不过,如果您尝试git diff HEAD,它仍然可见。

【讨论】:

猜你喜欢
  • 2011-03-01
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多