2015-02-19 20 views
6

BackroundGit zucca impegna di file rinominati (una storia mastio)

Ciao, sto lavorando su un ramo di caratteristica locale. Questo ramo locale è incasinato con un sacco di piccoli commit. Prima di spingere il ramo verso il remoto vorrei sistemare le cose.

Per questo mi piacerebbe fare un modo interattivo rebase:

git rebase -i 

Nessun problema finora.

Problema

Ora qui è la parte difficile: Durante lo sviluppo della funzione che ho fatto diverse refactoring tra cui rinomina e sposta di file. La storia dei file rinominati sono disponibili, a causa di rinominandoli con:

git -mv 

Ma quando ho schiacciare il commit prima e dopo la ridenominazione-impegna, la storia è andato e git comunica le modifiche come l'eliminazione e l'aggiunta di un file.

Qual è il problema?

Come posso eseguire uno schiacciamento dei commit incluso rinominare senza perdere la cronologia dei file?

risposta

1

Git non tiene traccia delle ridenominazioni direttamente, confronta i contenuti del file e rileva i nomi per similarità.

Quando si schiaccia una cronologia si inseriscono tutte le modifiche di un file in un unico commit. Il file potrebbe quindi cambiare molto rispetto al commit precedente. Quindi non è molto simile al commit precedente e git pensa che sia un delete/add.

se si desidera vedere la cronologia di tale file è necessario regolare la soglia find-renames. Per esempio. per il 50% di somiglianza utilizzano

git log --follow --find-rename=50 -- someFile 

opzioni simili sono disponibili anche per diff, merge e rebase. Date un'occhiata alla documentazione:

git rebase

rename-soglia = n Controlli la soglia di somiglianza utilizzato per il rilevamento di rinomina. Vedi anche git-diff 1 -M.

git diff

--find-rinomina [= n]

Detect rinomina. Se n è specificato, si tratta di una soglia sull'indice di similarità (cioè quantità di addizione/cancellazione rispetto alla dimensione del file). Ad esempio, -M90% significa che Git dovrebbe considerare che una coppia di eliminazione/aggiunta debba essere rinominata se oltre il 90% del file non è stato modificato. Senza un segno%, il numero deve essere letto come una frazione, con un punto decimale prima di esso. Cioè, -M5 diventa 0,5 ed è quindi uguale a -M50%. Allo stesso modo, -M05 è uguale a -M5%. Per limitare il rilevamento a nomi esatti, utilizzare -M100%. L'indice di somiglianza predefinito è 50%.

+0

Grazie per la risposta. Quindi, rinominare i file con 'git mv' non dice a git di conservare la cronologia di un file, ma semplicemente rinomina il file e in seguito rileva automaticamente che il file è stato rinominato? In altre parole: non c'è possibilità di fare ciò che volevo? L'unica possibilità è di fare il cambio di nome in un commit separato. – RamNow

Problemi correlati