"git diff"、"git diff HEAD" 和 "git diff --staged" 的奇怪输出?
Strange output of "git diff", "git diff HEAD" and "git diff --staged"?
有 3 个主要 git diff
版本:
git diff
- difference between WORKING DIRECTORY & STAGE
git diff --staged
- difference between HEAD & STAGE
git diff HEAD
- difference between HEAD & WORKING DIRECTORY
以上是我在网上几乎到处都能找到的各种人的定义
我按以下顺序对 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
a. file2 modified in working direcory
b. Nothing STAGED for commit
c. file1 & file3 not modified
我的查询是:
1. git差异
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 差异头
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) 与文件 1 相关,那么为什么显示文件 2 的差异?
HEAD 根本不包含与 file2 相关的任何内容
暂存文件 2 之后:
3。 git差异
没有显示任何内容!
(我假设它只会在文件暂存时显示差异,并且除了 暂存版本之外的一些 更改也在工作目录中进行)
好吧,如果是这样的话,那么为什么差异显示在 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 指向文件 1,为什么会显示文件 2 的差异?
我在下面创建了这张图片(注意:另一个场景。与上面不同):
对于 git diff HEAD
,我的猜测是 对于每个被跟踪的文件,HEAD 将继续向后移动,直到找到已提交的该文件的最新版本,以与工作目录
中的比较
如果我们考虑如下新场景,那么对于git diff HEAD
,它是否像我假设的那样?
您犯了一个根本错误,然后将此错误传播到您的各种命令中。
错误在于您将提交视为 更改。提交不是一组更改。一次提交包含文件的 快照 。此外,暂存区实际上从来没有 empty,1 它只是匹配 current commit,最初。
文件 file1.txt
、file2.txt
和 file3.txt
存在于:
- 你的工作树,作为普通文件;
- 索引/暂存区,作为Git特殊提交格式的文件,准备提交; 和
- 每次提交。
每个文件的每个副本都可以与同一文件(或任何其他文件)的其他副本相匹配,也可以不同。
名称 HEAD
选择了一个特定的提交。2 在各种测试开始时,名称 HEAD
选择了提交 ce6f5bb
.因此,除了之前提交的那些文件之外,此时还有三个名为 file1.txt
和 Git 的文件供您使用:
ce6f5bb:file1.txt
,又名 HEAD:file1.txt
:file1.txt
的这个副本被冻结到提交中,无法更改。
:file1.txt
:file1.txt
的这个副本在索引/暂存区中。您可以随时用新副本替换它。
file1.txt
:这只是一个普通文件。它实际上根本不是 in Git。这是一个常规文件,在您的工作树中。
还有file2.txt
三份,file3.txt
三份。
运行 git diff
不带参数将 HEAD
中的所有三个文件与工作树中的所有三个文件进行比较。只有那些不同的才会在输出中被提及。
运行 git diff --staged
或 git diff --cached
将 HEAD
中的所有三个文件与暂存区中的所有三个文件进行比较。只有那些不同的才会在输出中被提及。
运行 git diff HEAD
将 HEAD
中的所有三个文件与工作树中的所有三个文件进行比较。只有那些不同的才会在输出中被提及。
请注意,当您使用 git log -p
或 git show
查看提交时,Git 会对父提交的快照(其文件)与该提交的快照进行 git diff
快照。您看到的 diff 中仅提及那些不同的文件。所以它看起来像提交存储更改,但实际上,它只是存储一个快照。
还请注意,git status
运行两个 git diff
s:一个比较 HEAD
与暂存区,即执行 git diff --staged
,并仅提及文件名,不显示差异。这些是为提交 文件准备的更改。第二个差异比较索引与工作树,即执行 git diff
,并仅提及文件名。这些是 未提交的更改 。
1暂存区可以完全是空的,并且在一个没有文件的新存储库中并且none 还 git add
-ed。您还可以 git rm
每个文件,这将导致暂存区为空。但通常情况下,它充满了来自 HEAD
提交的文件副本,直到您使用 git add
将这些文件替换为工作树中的文件。
2你可以问Git两个关于特殊名字的问题HEAD
:
git rev-parse HEAD
询问 Git HEAD
代表什么哈希 ID,即当前提交是什么? 这就是 git diff
询问的问题。或者:
git symbolic-ref HEAD
git rev-parse --symbolic-full-name HEAD
问 Git HEAD
代表什么分支名称,即 git status
说我在哪个分支? 这个问题被 git commit
询问,例如,当它更新分支名称时。
有 3 个主要 git diff
版本:
git diff
- difference between WORKING DIRECTORY & STAGEgit diff --staged
- difference between HEAD & STAGEgit diff HEAD
- difference between HEAD & WORKING DIRECTORY
以上是我在网上几乎到处都能找到的各种人的定义
我按以下顺序对 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
a. file2 modified in working direcory
b. Nothing STAGED for commit
c. file1 & file3 not modified
我的查询是:
1. git差异
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 差异头
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) 与文件 1 相关,那么为什么显示文件 2 的差异?
HEAD 根本不包含与 file2 相关的任何内容
暂存文件 2 之后:
3。 git差异
没有显示任何内容!
(我假设它只会在文件暂存时显示差异,并且除了 暂存版本之外的一些 更改也在工作目录中进行)
好吧,如果是这样的话,那么为什么差异显示在 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 指向文件 1,为什么会显示文件 2 的差异?
我在下面创建了这张图片(注意:另一个场景。与上面不同):
对于 git diff HEAD
,我的猜测是 对于每个被跟踪的文件,HEAD 将继续向后移动,直到找到已提交的该文件的最新版本,以与工作目录
如果我们考虑如下新场景,那么对于git diff HEAD
,它是否像我假设的那样?
您犯了一个根本错误,然后将此错误传播到您的各种命令中。
错误在于您将提交视为 更改。提交不是一组更改。一次提交包含文件的 快照 。此外,暂存区实际上从来没有 empty,1 它只是匹配 current commit,最初。
文件 file1.txt
、file2.txt
和 file3.txt
存在于:
- 你的工作树,作为普通文件;
- 索引/暂存区,作为Git特殊提交格式的文件,准备提交; 和
- 每次提交。
每个文件的每个副本都可以与同一文件(或任何其他文件)的其他副本相匹配,也可以不同。
名称 HEAD
选择了一个特定的提交。2 在各种测试开始时,名称 HEAD
选择了提交 ce6f5bb
.因此,除了之前提交的那些文件之外,此时还有三个名为 file1.txt
和 Git 的文件供您使用:
ce6f5bb:file1.txt
,又名HEAD:file1.txt
:file1.txt
的这个副本被冻结到提交中,无法更改。:file1.txt
:file1.txt
的这个副本在索引/暂存区中。您可以随时用新副本替换它。file1.txt
:这只是一个普通文件。它实际上根本不是 in Git。这是一个常规文件,在您的工作树中。
还有file2.txt
三份,file3.txt
三份。
运行 git diff
不带参数将 HEAD
中的所有三个文件与工作树中的所有三个文件进行比较。只有那些不同的才会在输出中被提及。
运行 git diff --staged
或 git diff --cached
将 HEAD
中的所有三个文件与暂存区中的所有三个文件进行比较。只有那些不同的才会在输出中被提及。
运行 git diff HEAD
将 HEAD
中的所有三个文件与工作树中的所有三个文件进行比较。只有那些不同的才会在输出中被提及。
请注意,当您使用 git log -p
或 git show
查看提交时,Git 会对父提交的快照(其文件)与该提交的快照进行 git diff
快照。您看到的 diff 中仅提及那些不同的文件。所以它看起来像提交存储更改,但实际上,它只是存储一个快照。
还请注意,git status
运行两个 git diff
s:一个比较 HEAD
与暂存区,即执行 git diff --staged
,并仅提及文件名,不显示差异。这些是为提交 文件准备的更改。第二个差异比较索引与工作树,即执行 git diff
,并仅提及文件名。这些是 未提交的更改 。
1暂存区可以完全是空的,并且在一个没有文件的新存储库中并且none 还 git add
-ed。您还可以 git rm
每个文件,这将导致暂存区为空。但通常情况下,它充满了来自 HEAD
提交的文件副本,直到您使用 git add
将这些文件替换为工作树中的文件。
2你可以问Git两个关于特殊名字的问题HEAD
:
git rev-parse HEAD
询问 Git HEAD
代表什么哈希 ID,即当前提交是什么? 这就是 git diff
询问的问题。或者:
git symbolic-ref HEAD
git rev-parse --symbolic-full-name HEAD
问 Git HEAD
代表什么分支名称,即 git status
说我在哪个分支? 这个问题被 git commit
询问,例如,当它更新分支名称时。