使用
git blame file
将显示有关每一行的所有信息,例如谁在提交中添加此行,以及何时,但据我所知,Git将在每次更改文件时添加一个全新的对象。那么Git在哪里存储关于每一行的信息?
答案 0 :(得分:4)
正如@mvp所说,“它没有”。要回答你的评论 - 也就是说,“这个过程的流程” - 非常类似于一系列git diff
s,从文件的最新版本开始,然后向后工作,直到每行都有一个分配来源。
假设您有一个只有四行的短文件,它是最新的(即HEAD
中的版本)。进一步假设git diff
表明在修订版HEAD~1
中只有前三行,我添加了最后一行(第四行)。然后第4行的“责备”将是我的:它在之前的版本中不存在,并且当前存在,所以我必须添加它。
这就留下了弄清谁应该“责备”这三条线的问题。所以现在git必须与HEAD~1
区别HEAD~2
。如果这三行全部与HEAD~2
完全一致 - 例如,如果从HEAD~2
到HEAD~1
的更改只是删除某些行 - 那么我们必须继续追溯历史。
但在某些时候,git diff
会显示某人添加了第1行,第2行和/或第3行(在某些先前版本中),可能在删除其他行时(一个或多个);或者在最坏的情况下,git将达到“root commit”:没有父母的提交。在任何情况下,任何提交导致这些行出现的提交的人都必须是应该责备的人。
答案 1 :(得分:2)
Git在哪里存储关于每一行的信息?
Git不会将此信息存储在任何地方,至少不会明确地存储。每次运行git blame file
时,都会根据存储在git对象库中的对象动态计算此信息。如果您想知道这是如何完成的,可以阅读git blame.c source code。