2010-01-19 39 views
7

我即將在現有項目中移動大量文件。在我這樣做之前,我想牢牢掌握用於分析具有多文件歷史記錄的代碼的一些技術。Git:如何分析具有多文件歷史記錄的代碼?

我該如何使用git來問:「這行代碼是從哪裏來的?」當內容在其生命週期中移動了多個文件?

我知道git沒有明確地跟蹤重命名(出於很好的理由),所以看起來我應該可以問這個問題,我只是不知道該怎麼做。如果有方法可視化這也是很好的知識。

回答

5

我建議在git工具箱中查看三個工具。第一個是怪,這和CVS中的非常相似。它向您顯示哪個提交最後一次觸及文件中的每一行。如果你想看看之前有什麼,你可以採取觸及該行的提交併查看以前的提交。

git show <sha1_of_interesting_commit>^ -- file/path 

你可以重複責怪看看之前發生了什麼。

​​

第二個工具是用--follow跟蹤文件重命名過去。

git log --follow -- file/path 

第三個 - 也可能是最有用的工具 - 就是pickaxe選項。這將搜索歷史記錄以更改包含給定位文本的已刪除,已引入或已更改的行。這對跟蹤諸如函數名稱之類的東西特別有用。它可能在特定提交中的文件中是新的,但它是否來自不同的源文件?是在同一時間,還是在移動之前添加了一個電話?

git log -S"Interesting_Function" 

如果您使用的是補丁或統計選項(例如-p--stat)的輸出將被限制在其更改實際參與搜索字符串,除非你還使用--pickaxe-all其中顯示了整個變化的那些文件。

結合git grep來顯示當前字符串的所有位置,鎬是一個非常有用的歷史挖掘工具。

0

git blame是你用來問「這行代碼從哪裏來的?」。我不知道它是否處理重命名。可能是。

+1

git blame不適合檢測行移動(特別是在重構代碼時)。我的意思是如果一個開發人員寫了這一行,那麼下一個開發人員會因爲某種原因而將該行上移或下移--git blame將顯示後者。 – Eimantas 2010-01-19 19:55:47

+0

我不認爲這個答案是有幫助的,因爲1)'git blame'不會告訴你哪一段代碼來自哪裏 - 這就是'git log'的用處。 'git blame'只是告訴你最後一個人編輯文件中的每一行代碼。 2)'git blame'不遵循重命名,除非你添加'--follow'參數,如接受的答案所示(即使如此,如果文件被合併,重構等,它也會崩潰)。 – 2016-11-08 17:12:12

相關問題