2013-07-12 46 views
4

使用git blame如何確定誰編輯了一行文件?

git blame file 

會顯示每個行中的所有信息,例如誰加入這一行中承諾,而當,但據我所知,Git會每次更改添加一個完全新的對象文件。那麼Git在哪裏存儲每行信息?

+0

@Cupcake感謝您的修改,我會閱讀此鏈接,直到我從不犯同一個錯誤http://stackoverflow.com/posts/17607784/revisions –

+0

不要對自己過於苛刻威廉,只是需要的問題一點清理。相信我,我看到的問題遠非如此,遠非如此:/ – 2013-07-12 05:44:52

回答

4

正如@ mvp所說,「它不是」。儘管回答你的評論 - 也就是「這個過程的流程」 - 它的工作原理非常類似於一系列git diff,從最新版本的文件開始,並向後工作,直到每一行都有一個指定的來源。

假設您的文件只有四行,並且是最近的文件(即HEAD中的版本)。進一步假設git diff顯示在修訂HEAD~1中只有前三行,並且我添加了最後一行(第四行)。那麼第4行的「責任」應該是我的:它在以前的版本中並不存在,並且它在當前版本中,所以我必須添加它。

這留下了搞清楚誰應該爲這三條線「責怪」的問題。所以現在git必須在HEAD~2之間區別HEAD~1。如果這三條線全都與HEAD~2完全相同 - 例如,如果從HEAD~2HEAD~1的更改僅僅是刪​​除一些行,則情況可能如此 - 那麼我們必須繼續追溯歷史。

在某些時候,雖然,git diff將顯示有人加入第1行,第2行,和/或線3(在一些以前的版本),可能在刪除某些其他線(S);或者在最糟糕的情況下,git會達到「root commit」:一個沒有父母的提交。在任何情況下,誰犯下導致這些行出現的承諾,都必須是責難之一。

1

Git在哪裏存儲有關每行的信息?

Git不會將此信息存儲在任何地方,至少不是明確的。每次運行git blame file時,都會根據存儲在git對象存儲中的對象動態計算此信息。如果你有興趣知道如何做到這一點,你可以閱讀git blame.c source code

+0

如此三月份的代碼和C語言,我只知道一點Ruby,你能用人類可讀的描述總結那些代碼嗎?像這樣:首先它從這個對象讀取這個信息,並從那個對象中讀取這些信息,並將它們加在一起,然後把它們和wallah !,你得到你想要的!我不想知道低層次的細節,只是這個過程的流程 –