git blame file
會顯示每個行中的所有信息,例如誰加入這一行中承諾,而當,但據我所知,Git會每次更改添加一個完全新的對象文件。那麼Git在哪裏存儲每行信息?
git blame file
會顯示每個行中的所有信息,例如誰加入這一行中承諾,而當,但據我所知,Git會每次更改添加一個完全新的對象文件。那麼Git在哪裏存儲每行信息?
正如@ mvp所說,「它不是」。儘管回答你的評論 - 也就是「這個過程的流程」 - 它的工作原理非常類似於一系列git diff
,從最新版本的文件開始,並向後工作,直到每一行都有一個指定的來源。
假設您的文件只有四行,並且是最近的文件(即HEAD
中的版本)。進一步假設git diff
顯示在修訂HEAD~1
中只有前三行,並且我添加了最後一行(第四行)。那麼第4行的「責任」應該是我的:它在以前的版本中並不存在,並且它在當前版本中,所以我必須添加它。
這留下了搞清楚誰應該爲這三條線「責怪」的問題。所以現在git必須在HEAD~2
之間區別HEAD~1
。如果這三條線全都與HEAD~2
完全相同 - 例如,如果從HEAD~2
到HEAD~1
的更改僅僅是刪除一些行,則情況可能如此 - 那麼我們必須繼續追溯歷史。
在某些時候,雖然,git diff
將顯示有人加入第1行,第2行,和/或線3(在一些以前的版本),可能在刪除某些其他線(S);或者在最糟糕的情況下,git會達到「root commit」:一個沒有父母的提交。在任何情況下,誰犯下導致這些行出現的承諾,都必須是責難之一。
Git在哪裏存儲有關每行的信息?
Git不會將此信息存儲在任何地方,至少不是明確的。每次運行git blame file
時,都會根據存儲在git對象存儲中的對象動態計算此信息。如果你有興趣知道如何做到這一點,你可以閱讀git blame.c source code。
如此三月份的代碼和C語言,我只知道一點Ruby,你能用人類可讀的描述總結那些代碼嗎?像這樣:首先它從這個對象讀取這個信息,並從那個對象中讀取這些信息,並將它們加在一起,然後把它們和wallah !,你得到你想要的!我不想知道低層次的細節,只是這個過程的流程 –
@Cupcake感謝您的修改,我會閱讀此鏈接,直到我從不犯同一個錯誤http://stackoverflow.com/posts/17607784/revisions –
不要對自己過於苛刻威廉,只是需要的問題一點清理。相信我,我看到的問題遠非如此,遠非如此:/ – 2013-07-12 05:44:52