有了一个初始存储库,我创建了一个Test.TXT
文件,并用以下内容填充它:
Version 1
Version 1
Version 1
接下来,它被提交:
$ git commit -am Version1
Test.TXT
也遭受了一些打击:
Version 1
Version 2
Version 1
$ git commit -am Version2
现在我很想知道自Version1:以来对文件进行了哪些更改
$ 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指责只会导致出现符合所选SHA1提交的文件版本,不是吗?它甚至没有显示以前提交的SHA1(这样的结果可以通过使用不带两个点的指责来实现(,也没有显示下面的提交(我试图实现(。相反,我们可以看到由插入符号设置的键入的SHA1版本。
有人能解释一下使用这个命令(带双点(的原因吗?
如果您只是执行命令(在repo根目录中(:
git blame ..
git会告诉你:
$ git blame ..
fatal: '..' is outside repository
论点:
..
在本例中,是对父目录的引用。如果您随后传递一个文件作为参数:
git blame .. -- changelog.txt
您会注意到,输出中每一行都有^abcdbeef
语法,以及您作为提交者的名称(尽管它实际上可能是其他人的文件(。引用之前的^
表示从当前分支/引用无法访问它。
嗯。。。。..
似乎指向the parent directory
,正如zbrbite所说。。。这是我第一次看到它被这样使用。。。。(..然后提供fulename(。我知道,如果你想指责只分析修订的子集,而不是文件的全部内容(比如……version-from-a-year-ago..some-branch
(,你可以使用它。然后,假设您专门提供了一个修订版,git实际上并没有像当前修订版那样检查文件。它将责任归咎于该文件,因为它是该修订的。。。。。^的意思是,据我所知,它在可供分析的修订范围内(比如……一个已有10年历史的项目,你可能会要求指责检查过去5年的情况……它可能会发现这条线来自这5年的第一次修订……可能有比它更古老的修订,但它无法进一步检查,因为你只限于过去5年……因此你得到了一个^(。如果你提供了HEAD(并且你站在第二个修订版上(作为修订版,如果该修订版上的行发生了某种变化,你可能会得到新的修订版。。。。。但你在用HEAD进行指责时,每一行都得到了新的修订?这听起来像是您更改了文件的EOL格式。如果您尝试git blame -w -- the-file
会发生什么?