2017-09-19 55 views
0

假設我的項目有兩個分支:stable和master。 在主分支,前一段時間,我已經手動移動了一些文件,但不幸的是沒有使用git mv命令,但是手動,因此似乎git沒有標記此移動(雖然它通常是這樣)。重新附加從git中的其他分支移動文件

現在我遇到這樣的問題,每次我在這些文件上對穩定分支進行一些更改時,我想將這些更改合併回主,它總是告訴我這些更改是全新的文件,只是顯示更改,使合併變得非常困難,不僅因爲我現在必須合併這些文件,而且由於這些文件傾向於轉移,所以日復一日變得越來越詭異。

是否有可能,現在這兩個文件僅實際上是相同的,並顯示差異通知混帳,我彷彿擺在首位進行git mv它會做什麼?

+0

從我記得,如果你使用'git mv'或者''mv'關於移動文件,這並不重要。一般來說,很難在Git中跟蹤移動/重命名文件中的差異(您可以在SO中搜索以獲取更多信息)。我的建議是,如果你計劃在兩個不同的分支中長期使用兩個不同的版本,那麼就不要移動/重命名文件。 –

+1

我知道一般情況並不重要,但我確定它通常會跟蹤事物,而其他文件確實標記了mv。 – Panayotis

+0

@TimBiegeleisen是正確的,git不記錄移動,它使用一種叫做相似性索引的東西來確定兩個文件是否相同。如果它沒有檢測到移動的文件,則A)修改了超過50%的文件或B)在兩個分支中所做的更改之間存在實際的合併衝突 – LightBender

回答

1

作爲LightBender commented,GIT中確實重命名檢測而非重命名跟蹤。在Git 2.9或更新的版本中,默認情況下,對於普通的git diff,此檢測功能也處於打開狀態,但如果您的Git較早,或者您需要降低重命名檢測閾值,則可以指定-M選項以及「相似性索引」編號。

您還可以指定合併時使用的特定相似索引,使用-X find-renames=<number>(這兩個命令中的數字具有相同的形式,並且相同的缺省值50表示「50%相似」)。

注意,你真的應該兩個分支提示的合併基礎每個尖端比較,看看有什麼被檢測爲重命名。只有當一個提示與合併基準非常相似時,才能比較兩個提示就足夠了。作爲簡化實例,假定一些基本文件讀取,將其全部:

alfa_ 
bravo 
charl 
delta 
echo_ 

(I所做5行中的所有相同的長度,使得百分比工作出很好)。

在分支X,這同一個文件上寫着:

foxtr 
golf_ 
charl 
delta 
echo_ 

在分支Y,該文件內容如下:

alfa_ 
bravo 
charl 
hotel 
india 

,並在兩個分支中的一個,該文件也更名(從「試點字母」 到"NATO phonetic alphabet",也許):

...--B--o--...--L <-- branch_X 
     \ 
     o--...--R <-- branch_Y 

這裏,提交B是將原始文件與原始文件名合併到一起。將它與分支X中的提交L進行比較,結果爲60%:五行中的兩行更改。將它與分支Y中的提交R進行比較,它與60%相同:五行中的不同兩行更改。所以Git可以匹配這三個文件,即使三個文件中的一個具有不同的名稱。

比較承諾L提交R,但是,該文件只有20%類似:只有charl(charlie-for-C)行匹配!

相關問題