在git-blame命令中使用双点..的含义

问题描述

拥有一个初始存储库,我创建了一个Test.TXT文件,并使用以下内容填充该文件

Version 1
Version 1
Version 1

接下来,它被提交:

$ git commit -am Version1

Test.TXT遭到了一些修改

Version 1
Version 2
Version 1

$ git commit -am Version2

现在我很想知道自版本1起对文件进行了哪些更改:

$ git log --oneline -- Test.TXT
f315c22 (HEAD -> master) Version2
3b173c2 Version1

$ git blame 3b173c2 .. -- Test.TXT
^3b173c2 (Mergasov 2020-10-06 13:49:50 +0300 1) version 1
^3b173c2 (Mergasov 2020-10-06 13:49:50 +0300 2) version 1
^3b173c2 (Mergasov 2020-10-06 13:49:50 +0300 3) version 1

这种怪的输出对我来说有点出乎意料。

首先,插入符号(^)代表什么?怪异的文档将其称为边界标记(即,它标记文件的第一次提交)。但是,如果我输入HEAD(这是Test.TXT的第二次提交)而不是3b173c2,我会得到 ^ f315c22(在每行)。

所以以这种方式使用git blame只会导致出现符合所选SHA1提交的文件版本,不是吗?它甚至都不会显示以前提交的SHA1(可以通过使用不带两个点的怪来实现此结果)或之后的提交(我尝试完成)。取而代之的是,可以看到键入的SHA1版本由插入符号引起。

有人可以解释使用此命令(带有双点)的原因吗?

解决方法

如果要简单地执行命令(在仓库根目录中):

git blame ..

git会告诉你:

$ git blame ..
fatal: '..' is outside repository

参数:

..
在这种情况下,

是对父目录的引用。如果您随后将文件作为参数传递:

git blame .. -- changelog.txt

您会注意到输出的每一行都具有^abcdbeef语法以及您的名称(作为提交者)(尽管实际上可能是其他人的文件)。引用之前的^表示无法从您当前的分支/引用中访问它。

,

好吧...... ..似乎指向the parent directory,正如zbrrbite所说的...这是我第一次看到它像那样使用....(..和然后提供一个全称)。我知道,如果您要责怪分析仅一部分修订版本,而不分析文件的全部内容(例如..... version-from-a-year-ago..some-branch),则可以使用它。然后,鉴于您要专门提供一个修订版本,因此git实际上不会像检查当前修订版本那样检查文件。它是因为该修订版上的文件是 所致..据我所知,^表示该文件用于分析的修订版范围有限(例如...一个项目已有10年历史了,您可能曾责怪过往5年内进行检查....它可能发现该行来自这5年中的第一次修订... 。可能有比其涉及的版本更旧的修订,但是由于您的限制仅限于最近5年,因此无法进行更进一步的审查....因此,您得到^)。如果您提供HEAD(并且您正站在第二个修订版中)作为修订,那么如果该修订中的行发生了某些更改,那么您可能会获得新修订.....但是在运行时您会在每一行上获取新修订怪头吗?听起来您更改了文件的EOL格式。如果您尝试git blame -w -- the-file会怎样?