使用
git blame file
将显示关于每一行的所有信息,例如谁在哪个提交中添加了这一行,以及何时添加,但据我所知,Git每次更改文件时都会添加一个全新的对象。那么Git在哪里存储每一行的信息呢?
正如@mvp所说,"事实并非如此"。不过,要回答你的评论——也就是"这个过程的流程"——它的工作原理非常粗略,就像一系列git diff
,从文件的最新版本开始,然后向后工作,直到每一行都有一个指定的原点。
假设您有一个只有四行的短文件,并且它是最新的(即HEAD
中的版本)。进一步假设git diff
显示在修订版HEAD~1
中只有前三行,我添加了最后一行(第四行)。那么第4行的"责任"将是我的:它在以前的版本中不存在,而在当前版本中存在,所以我一定添加了它。
这就留下了弄清楚谁应该为这三条线"负责"的问题。所以现在git必须将HEAD~1
与HEAD~2
进行比较。如果这三行在HEAD~2
中的显示完全相同——例如,如果从HEAD~2
到HEAD~1
的更改只是为了删除一些行,那么可能会出现这种情况——那么我们必须继续追溯历史。
然而,在某个时刻,git diff
将显示某人添加了第1行、第2行和/或第3行(在某些早期版本中),可能同时删除了其他行;或者在最坏的情况下,git将达到"根提交":一个没有父级的提交。无论如何,无论是谁犯下了导致这些台词出现的罪行,都必须受到谴责。
Git在哪里存储每一行的信息?
Git不会将这些信息存储在任何地方,至少不会显式存储。每次运行git blame file
时,都会根据git对象存储中存储的对象动态计算此信息。如果您有兴趣了解具体是如何做到这一点的,可以阅读git责怪.c源代码。