2011-06-28 12 views
5

使用Git處理類重命名(例如,使用Resharper完成)的最佳方式是什麼?當一個提交中的類和文件名更改時,Git重命名檢測

也就是說,如果類名和包含文件名都一起更改並提交而不做進一步更改。

看來,Git通過百分比改變啓發式來處理重命名的方式有點碰撞和錯過。 對於大類,它將被識別爲重命名,但對於小類,會達到百分比閾值,以便將其視爲刪除和添加。

+1

Git不會顯式地跟蹤重命名。它是即時推斷的,所以如果Git無法檢測到它,就沒有辦法讓Git像重命名一樣。 – hammar

回答

6

請記住,在Git的歷史中,文件重命名爲而不是存儲爲「這是從X更名爲Y」。相反,文件X存在於一個版本中,並且在下一版本Y中存在(並且X不存在)。例如:

 
Revision | Files 
---------+---------------------------------- 
HEAD^ | a.cpp x.cpp    z.cpp 
HEAD  | a.cpp    y.cpp z.cpp 

在上圖中,每個修訂版都是一行,每個修訂版都包含三個文件。在兩次修訂之間,x.cpp被更名爲y.cpp。存儲庫存儲的唯一信息是每個單獨版本的內容。

當Git(或讀取Git存儲庫的其他工具)查看上述歷史記錄時,它注意到y.cppHEAD中的新文件。然後它查看之前的修訂版以查看是否存在類似的文件。在直接文件重命名的情況下,是的,一個名爲x.cpp的文件具有相同的內容存在於先前的修訂版中(並且不再存在於當前修訂版中)。因此新文件顯示爲從x.cppy.cpp的重命名。

在重命名和修改的情況下,Git會查看以前版本的文件,看看一個文件是否看起來接近新文件(就其內容而言)。這就是啓發式進來的地方。如果大多數行都是相同的,那麼Git會將它顯示爲重命名,但是如果與沒有更改的行相比有足夠的更改行,那麼Git會簡單地說它看起來像一個新文件。

要回答你的問題,處理resharper類重命名的最好方法是簡單地執行並提交新文件。 Git將舊文件和新文件存儲在其存儲庫中。稍後處理重命名檢測時,您實際詢問歷史記錄。這就是爲什麼諸如git log之類的命令具有諸如--find-copies--find-copies-harder之類的選項的原因。

+0

那麼你是說,「就在重命名之前發表評論,他們在重命名後再次提交」 –

+1

@伊恩Ringrose:不是,不。如果你這樣做,你會在項目狀態無法正確建立的地方進行提交(因爲事情可能處於半重命名狀態)。進行更改,包括必要時重命名以及提交工作代碼。 –

相關問題