git如何确定谁编辑了一行文件?

时间:2013-07-12 05:09:55

标签: git version-control blame

使用

git blame file

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

2 个答案:

答案 0 :(得分:4)

正如@mvp所说,“它没有”。要回答你的评论 - 也就是说,“这个过程的流程” - 非常类似于一系列git diff s,从文件的最新版本开始,然后向后工作,直到每行都有一个分配来源。

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

这就留下了弄清谁应该“责备”这三条线的问题。所以现在git必须与HEAD~1区别HEAD~2。如果这三行全部与HEAD~2完全一致 - 例如,如果从HEAD~2HEAD~1的更改只是删除某些行 - 那么我们必须继续追溯历史。

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

答案 1 :(得分:2)

  

Git在哪里存储关于每一行的信息?

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