8

使用

git blame file

将显示有关每一行的所有信息,例如谁在哪个提交中添加了这一行,以及何时添加,但据我所知,每次更改文件时,Git 都会添加一个全新的对象。那么Git在哪里存储关于每一行的这些信息呢?

4

2 回答 2

6

正如@mvp 所说,“它没有”。不过,要回答您的评论(即“此过程的流程”),它的工作方式非常类似于一系列git diffs,从文件的最新版本开始,然后向后工作,直到每一行都有一个指定的来源。

假设您有一个只有四行的短文件,它是最新的(即 中的版本HEAD)。进一步假设这git diff表明在修订HEAD~1中只有前三行,我添加了最后(第四)行。那么第 4 行的“责备”将是我的:它在以前的版本中不存在,而在当前版本中存在,所以我必须添加它。

这就留下了找出这三行“责备”谁的问题。所以现在 git 必须HEAD~1HEAD~2. 如果这三行都完全按照原样出现HEAD~2——例如,从HEAD~2to的改变HEAD~1只是为了删除一些行——那么我们必须继续追溯历史。

但是,在某些时候,git diff会显示有人添加了第 1 行、第 2 行和/或第 3 行(在某些以前的版本中),可能同时删除了其他一些行;或者在最坏的情况下,git 将达到“根提交”:没有父母的提交。无论如何,无论是谁提交了导致这些行出现的提交,都必须受到责备。

于 2013-07-12T11:13:28.717 回答
3

Git 在哪里存储有关每一行的此类信息?

Git 不会将这些信息存储在任何地方,至少不会明确存储。每次运行时git blame file,此信息都是根据存储在 git 对象存储中的对象动态计算的。如果你有兴趣知道这是如何完成的,你可以阅读 git blame.c 源代码

于 2013-07-12T05:59:48.250 回答