使用
git blame file
将显示有关每一行的所有信息,例如谁在哪个提交中添加了这一行,以及何时添加,但据我所知,每次更改文件时,Git 都会添加一个全新的对象。那么Git在哪里存储关于每一行的这些信息呢?
使用
git blame file
将显示有关每一行的所有信息,例如谁在哪个提交中添加了这一行,以及何时添加,但据我所知,每次更改文件时,Git 都会添加一个全新的对象。那么Git在哪里存储关于每一行的这些信息呢?
正如@mvp 所说,“它没有”。不过,要回答您的评论(即“此过程的流程”),它的工作方式非常类似于一系列git diff
s,从文件的最新版本开始,然后向后工作,直到每一行都有一个指定的来源。
假设您有一个只有四行的短文件,它是最新的(即 中的版本HEAD
)。进一步假设这git diff
表明在修订HEAD~1
中只有前三行,我添加了最后(第四)行。那么第 4 行的“责备”将是我的:它在以前的版本中不存在,而在当前版本中存在,所以我必须添加它。
这就留下了找出这三行“责备”谁的问题。所以现在 git 必须HEAD~1
与HEAD~2
. 如果这三行都完全按照原样出现HEAD~2
——例如,从HEAD~2
to的改变HEAD~1
只是为了删除一些行——那么我们必须继续追溯历史。
但是,在某些时候,git diff
会显示有人添加了第 1 行、第 2 行和/或第 3 行(在某些以前的版本中),可能同时删除了其他一些行;或者在最坏的情况下,git 将达到“根提交”:没有父母的提交。无论如何,无论是谁提交了导致这些行出现的提交,都必须受到责备。
Git 在哪里存储有关每一行的此类信息?
Git 不会将这些信息存储在任何地方,至少不会明确存储。每次运行时git blame file
,此信息都是根据存储在 git 对象存储中的对象动态计算的。如果你有兴趣知道这是如何完成的,你可以阅读 git blame.c 源代码。