Ho spostato un file usando git mv
. Ora vorrei fare una differenza sul nuovo file per confrontarlo con il vecchio file (con il vecchio nome, ora inesistente).
Come faccio a fare questo?
Ho spostato un file usando git mv
. Ora vorrei fare una differenza sul nuovo file per confrontarlo con il vecchio file (con il vecchio nome, ora inesistente).
Come faccio a fare questo?
Risposte:
Devi usare -M per consentire a git di rilevare automaticamente il file spostato durante il diffing. Usare esattamente git diff
come menzionato Knittl non funziona per me.
Quindi semplicemente: git diff -M
dovrebbe farlo.
La documentazione per questo switch è:
-M[<n>], --find-renames[=<n>]
Detect renames. If n is specified, it is a threshold on the similarity index
(i.e. amount of addition/deletions compared to the file’s size). For example,
-M90% means git should consider a delete/add pair to be a rename if more than
90% of the file hasn’t changed.
~/.gitconfig
?
git diff
. L'esecuzione git diff -M
su un singolo file (rinominato) non segnala una ridenominazione.
git log --follow -- file_after_move.txt
funziona bene. Mostra l'intera storia, anche prima del trasloco. Qualche idea? Sto correndo git version 2.11.0.windows.1
.
-C
opzione per il rilevamento di copie è utile e simile. L'ho usato -M
per guardare un diff dove avevo refactored un file in due (senza nessun nome corrispondente all'originale).
Oltre a ciò che ha scritto Knittl , puoi sempre usare:
git diff HEAD:./oldfilename newfilename
dove HEAD:./oldfilename
significa oldfilename nell'ultimo commit (in HEAD), relativo alla directory corrente.
Se non hai abbastanza nuovo git, dovresti usare invece:
git diff HEAD:path/to/oldfilename newfilename
git diff 39fa7c77e85c51d43ea0cf30d33aec8721812e9e:./oldfilename newfilename
git diff branch:old/filen.name newfilename
cd
nella directory e non si aggiunge --
prima della commit:path
coppia. Git sembra essere molto esigente con la sintassi qui.
<commit-ish>:<pathname>
sintassi è un identificatore di oggetto, qualcosa di Git-ish; dopo che --
Git si aspetta solo nomi di file.
Con git 2.9 (giugno 2016), non dovrai -M
più aggiungere . git diff
utilizza -M
per impostazione predefinita.
Vedi commit 5404c11 , commit 9501d19 , commit a9276a6 , commit f07fc9e , commit 62df1e6 (25 febbraio 2016) di Matthieu Moy ( moy
) .
(Unita da Junio C Hamano - gitster
- in commit 5d2a30d , 03 apr 2016)
diff
: attivadiff.renames
di defaultRinomina il rilevamento è una funzionalità molto conveniente e i nuovi utenti non dovrebbero scavare nella documentazione per trarne vantaggio.
Le potenziali obiezioni all'attivazione del rilevamento della ridenominazione sono che a volte fallisce ed a volte è lento. Ma il rilevamento della ridenominazione è già attivato di default in diversi casi come "
git status
" e "git merge
", quindi l'attivazionediff.renames
non cambia sostanzialmente la situazione. Quando il rilevamento della ridenominazione fallisce, ora fallisce costantemente tra "git diff
" e "git status
".Questa impostazione non influisce sui comandi idraulici, quindi gli script ben scritti non saranno interessati.
git diff -M
attiva il rilevamento della ridenominazione come altri hanno già detto (e come sottolineato da @VonC, è attivato di default da git 2.9). Ma se si dispone di un grosso changeset, il rilevamento inesatto di ridenominazione potrebbe essere disattivato di nuovo. Git visualizzerà un avviso come il seguente, che è facile perdere tra le differenze che stai visualizzando:
warning: inexact rename detection was skipped due to too many files.
warning: you may want to set your diff.renameLimit variable to at least 450 and retry the command.
In tal caso, impostare l'opzione di configurazione come suggerito da git, ad esempio
git config diff.renamelimit 450
e riesegui il tuo comando diff.
Per qualsiasi motivo l'utilizzo HEAD:./oldfilename
(o il percorso assoluto) non ha funzionato per me, ma HEAD:oldfilename
(grazie cmn):
git diff HEAD:oldfilename newfilename
git diff 2a80f45:oldfilename f65f3b3:newfilename
HTH
HEAD:./oldfilename
?
semplicemente eseguire git diff
senza argomenti, o git diff -- newfilename
. git è abbastanza intelligente da confrontare i giusti file / contenuti (ad es. contenuto originale prima di rinominare con contenuto alterato dopo rinominare)
git mv
inserimento di un singolo file e quindi il confronto dello stato di gestione temporanea con un altro ramo altrimenti identico produrrà il diff "tutto è stato eliminato e ricreato di nuovo" a meno che non -M
venga utilizzato.
git diff -- yourRenamedFile
sarà sufficiente una semplice . Vedi la mia risposta qui sotto