Git rileva sempre i nomi "dopo il fatto", confrontando i due alberi in questione (o un albero e l'indice, per i casi che non includono git merge
stesso). (Linus Torvalds considera questa una caratteristica, vedi this SO question per esempio.)
In ogni caso, git merge
verrà eseguito diff interno di git con rilevamento merge abilitata e la somiglianza-indice di default del 50%, a meno che non si configura diversamente. Analogamente, git diff
ha alcune impostazioni predefinite che sono anche configurabili. Se esegui manualmente git diff --find-renames -M50%
tra il merge-base e l'upstream, probabilmente stai bene (ma vedi la nota 1 sulla configurazione).
Se git non rileva, è possibile che sia necessario regolare le soglie di rilevamento del rename e/o aumentare il numero di file che git dovrebbe prendere in considerazione. Il primo di questi è il valore rename-threshold
nelle opzioni -X
(rename-threshold
compare per la prima volta in git 1.7.4). Vedi the documentation per i dettagli.
È possibile impostare merge.renameLimit
per il numero di file da considerare in termini di rilevazione Rinomina. Se non lo si imposta, il valore predefinito corrente è 1000 file (ma l'impostazione predefinita è cambiata nel tempo). Inoltre, se non lo imposti, unisci usa diff.renameLimit
, quindi puoi impostare solo il secondo di questi e avere sia diff sia unire usa entrambi i valori.
Il modo in cui il rilevamento del rinominare file funziona è un po 'complesso, ma abbastanza semplice da descrivere con l'esempio. Supponiamo che git stia confrontando commit 12345
con commit 67890
, e in 12345
ci sono file con nomi di percorso A
, B/C
e D
; ma in 67890
ci sono i nomi di percorso B/gronk
, B/C
e D
. Ciò significa che il percorso A
è scomparso, ma è stato visualizzato il nuovo percorso B/gronk
.Git ricorderà quindi tali percorsi (fino al valore limite di ridenominazione) e confronterà i contenuti di 12345:A
con il contenuto di 67890:B/gronk
. Se i file sono "sufficientemente simili", git dichiarerà che 12345:A
è stato rinominato in 67890:B/gronk
.
Non sono sicuro di come Git decida che un file è del 50%, o del 75%, o simile, simile/diverso. Ho visto che l'indice di similarità è basato su "chunk" piuttosto che su linee (anche se il solito output diff è orientato alla linea), comunque.
Hai conflitti durante la fusione? Di solito Git è abbastanza intelligente da capire che un file è stato spostato. Cosa succede se si esegue semplicemente "git merge origin/master' (o qualunque sia il nome del ramo upstream)? – knittl