0

有了一个初始存储库,我创建了一个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 版本由插入符号表示。

任何人都可以解释使用此命令(带有双点)的原因是什么?

4

2 回答 2

3

如果您只是执行命令(在 repo 根目录中):

git blame ..

git 会告诉你:

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

论据:

..

在这种情况下,是对父目录的引用。如果您随后将文件作为参数传递:

git blame .. -- changelog.txt

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

于 2020-10-06T12:46:48.467 回答
-2

嗯......似乎指向the parent directory,正如 zbrrbit 所说...这是我第一次看到它被这样使用....(..然后提供一个fulename)。我知道如果你的意思是让责备只分析修订的一个子集,而不是文件的完整故事(比如..... version-from-a-year-ago..some-branch),我知道你可以使用它。然后鉴于您专门提供了修订版,git 实际上并没有像当前修订版那样检查文件。原样责备文件在那次修订...... 据我所知, ^ 表示它处于其用于分析的修订范围的限制(例如......一个已有 10 年历史的项目,您可能要求责备检查过去 5 年的情况……它可能发现该行来自那 5 年的第一次修订……可能有比它所涉及的更旧的修订,但它可以'由于您的限制只能从过去 5 年开始,因此请不要再往前检查....因此您会得到一个 ^)。如果您提供 HEAD (并且您站在第二个修订版上)作为修订版,如果该修订版以某种方式更改了该行,您可能会获得新修订版.....但是在运行时您会在每一行上获得新修订版责怪 HEAD?听起来您更改了文件的 EOL 格式。如果你尝试会发生什么git blame -w -- the-file

于 2020-10-06T13:54:46.630 回答