【发布时间】:2020-05-27 20:53:00
【问题描述】:
git diff 主要有 3 个版本:
git diff- WORKING DIRECTORY 和 STAGE 之间的区别git diff --staged- HEAD 和 STAGE 之间的区别- 之间的区别
git diff HEAD- HEAD 和 工作目录
以上是我在网上从不同的人那里找到的几乎每个地方的定义
我按以下顺序对 3 个文件执行了某些提交:
ce6f5bb (HEAD -> master) 6th commit, file1 c1c67da 5th commit, file3 ea51776 4th commit, file1 file2 001675b 3rd commit, file1 file2 ec04f53 2nd commit, file2 21cb6c1 1st commit, file1一个。 file2 在工作目录中修改
b.没有任何准备提交
c。 file1 & file3 未修改
我的查询是:
1。混帐差异
git diff
diff --git a/file2.txt b/file2.txt
index 21106bf..c755a1e 100644
--- a/file2.txt
+++ b/file2.txt
@@ -1,3 +1,4 @@
123
345
678
+90.
即使暂存区是空的,为什么会显示差异?
2。 git diff 头
git diff
diff --git a/file2.txt b/file2.txt
index 21106bf..c755a1e 100644
--- a/file2.txt
+++ b/file2.txt
@@ -1,3 +1,4 @@
123
345
678
+90.
如果 LAST COMMIT (HEAD) 与 file1 相关,那么为什么会显示 file2 的差异?
HEAD 不包含任何与文件2
暂存文件2之后:
3。混帐差异
它不显示任何东西!
(我假设它只会在文件被暂存时显示差异,并且在工作目录中也进行了一些 除了暂存版本之外的更改)
那么如果是这样的话,那么为什么 diff 会显示在 1.
4。 git diff --staged
git diff
diff --git a/file2.txt b/file2.txt
index 21106bf..c755a1e 100644
--- a/file2.txt
+++ b/file2.txt
@@ -1,3 +1,4 @@
123
345
678
+90.
如果 HEAD 指向 file1,为什么会显示 file2 的差异?
我在下面创建了这张图片(注意:另一个场景。与上面不同):
对于git diff HEAD,我的猜测是对于每个跟踪的文件,HEAD 将继续向后移动,直到找到提交的该文件的最新版本,以便与工作目录中的文件进行比较
如果我们考虑如下新场景,那么对于git diff HEAD,它是否像我假设的那样?
【问题讨论】:
-
暂存区永远不会是空的,除非您有意删除了所有内容。暂存区默认为 HEAD 的内容。本质上,如果您进行允许“空”提交的提交,将提交的内容是空的,即没有进行任何更改,但在内容方面永远不会为空。暂存区包含提交时将提交的快照,因此它默认为 HEAD 的内容。
-
与 HEAD 相比,您的 HEAD 和工作目录之间的差异表明您已经更改了工作目录中的文件。根据您的标准列表,其他两个文件未更改,因此未显示。
-
我认为让您感到困惑的是,当 git 列出差异和状态时,它会忽略不引入更改的所有内容。这就是为什么,即使暂存区 包含 默认情况下 HEAD 中的所有内容,如果您要求 git 显示其内容,它也不会显示任何内容,因为两者之间没有 区别 HEAD 和暂存区。
-
例如,执行以下操作。确保您有一个原始的结帐,工作文件夹中没有更改,暂存区也没有更改。然后通过在一行中添加 1 个字母来修改文件。通过
git add .添加它,然后执行git diff --staged。你会看到变化。然后,再次修改文件,删除您添加的字母。添加它,然后再次进行差异。即使您添加了两次,它也应该再次显示没有变化。 -
提交始终是一个完整的快照,但它不会为所有文件创建新副本,它会引用数据库中的现有对象以获取未更改的文件,但您可以说commit 包含所有文件,而不仅仅是那些被更改的文件。
标签: git github version-control diff git-diff