问题描述
拥有一个初始存储库,我创建了一个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
会怎样?