gpt4 book ai didi

git - "git diff"、 "git diff HEAD"和 "git diff --staged"的奇怪输出?

转载 作者:行者123 更新时间:2023-12-04 15:27:04 25 4
gpt4 key购买 nike

主要有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 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.

即使暂存区是空的,为什么会显示差异?

2. git diff HEAD
    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 根本不包含与 file2 相关的任何内容



现在在暂存文件 2 之后 :

3. git 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 ,是不是像我假设的那样?

enter image description here

最佳答案

您犯了一个基本错误,然后将此错误传播到您的每个命令中。

错误在于您将提交视为更改。提交不是一组更改。提交保存文件的快照。此外,暂存区实际上从来都不是空的,1 它最初只是匹配当前的提交。

文件 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 : 这只是一个普通的文件。它实际上根本不在 Git 中。它是一个常规文件,位于您的工作树中。
  • file2.txt也有三份和三份 file3.txt .

    运行 git diff不带参数比较 HEAD 中的所有三个文件到工作树中的所有三个文件。只有那些不同的才会在输出中提及。

    运行 git diff --stagedgit diff --cached比较 HEAD 中的所有三个文件到暂存区中的所有三个文件。只有那些不同的才会在输出中提及。

    运行 git diff HEAD比较 HEAD 中的所有三个文件到工作树中的所有三个文件。只有那些不同的才会在输出中提及。

    请注意,当您使用 git log -pgit show要查看提交,Git 执行 git diff父提交的快照 - 它的文件 - 与该提交的快照。您看到的 diff 中只提到了那些不同的文件。所以看起来提交存储更改,但实际上,它只存储快照。

    还要注意, git status运行两个 git diff s:一比较 HEAD vs staging-area,即做 git diff --staged , 并且只提到文件的名称,没有显示差异。这些是为提交文件暂存的更改。第二个差异比较索引与工作树,即做 git diff , 并仅提及文件名。这些是未为提交而暂存的更改。

    1暂存区可以是完全空的,并且在一个新的存储库中,其中没有文件,也没有文件 git add -ed。您也可以 git rm每个文件,这将导致暂存区为空。但通常情况下,它充满了来自 HEAD 的文件副本。提交,直到您使用 git add用工作树中的文件替换这些文件。

    2关于特殊名称 HEAD可以问Git两个问题:
    git rev-parse HEAD

    问 Git 什么哈希 ID HEAD代表,即当前的提交是什么?就是那个 git diff问。或者:
    git symbolic-ref HEAD
    git rev-parse --symbolic-full-name HEAD

    问 Git 分支名称是什么 HEAD代表,即哪个分支会 git status说我在? git commit 提出了这个问题,例如,当它去更新分支名称时。

    关于git - "git diff"、 "git diff HEAD"和 "git diff --staged"的奇怪输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62052670/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com