file git diff rispetto all'ultima modifica


236

È possibile ottenere git per produrre un diff tra un file specifico come esiste ora e come esisteva prima dell'ultimo commit che lo ha cambiato?

Cioè, se sappiamo:

$ git log --oneline myfile
123abc Fix some stuff
456def Frobble the foos
789dba Initial commit

Quindi git diff 456def myfilemostra l'ultima modifica a myfile. È possibile fare lo stesso senza la conoscenza prodotta dal git log; cosa è cambiato in 123abc?


8
Preferisco usaregit diff HEAD^ <file_path>
asgs

4
@asgs - Non fa quello che stavo chiedendo (per due motivi - HEAD^è 123abc, HEAD^^è 456def; e se ci fossero altri commit che non hanno influenzato questo file, allora si HEAD^riferisce a loro)
Chowlett

Hai ragione, hai perso la parte "l'ultimo commit che l'ha cambiato"
chiede il

Risposte:


215

Questo esiste, ma in realtà è una caratteristica di git log:

git log -p [--follow] [-1] <path>

Nota che -ppuò anche essere usato per mostrare il diff inline da un singolo commit:

git log -p -1 <commit>

Opzioni utilizzate:

  • -p(anche -uo --patch) è nascosto nella git-logpagina man ed è in realtà un'opzione di visualizzazione per git-diff. Se utilizzato con log, mostra la patch che verrebbe generata per ogni commit , insieme alle informazioni di commit - e nasconde i commit che non toccano il valore specificato <path>. (Questo comportamento è descritto nel paragrafo su --full-diff, che fa sì che venga mostrato l'intero diff di ciascun commit.)
  • -1mostra solo le modifiche più recenti al file specificato ( -n 1può essere utilizzato al posto di -1); in caso contrario, vengono visualizzate tutte le differenze diverse da zero di quel file.
  • --follow è necessario per visualizzare le modifiche avvenute prima di una ridenominazione.

Per quanto ne so, questo è l'unico modo per vedere immediatamente l'ultima serie di modifiche apportate a un file senza usare git log(o simili) per contare il numero di revisioni intervenute o determinare l'hash del commit.

Per visualizzare le modifiche delle revisioni precedenti, basta scorrere il registro o specificare un commit o un tag da cui avviare il registro. (Naturalmente, specificando un commit o tag si ritorna al problema originale di capire quale sia il commit o tag corretto.)

Credito in cui il credito è dovuto:

  • L'ho scoperto log -pgrazie a questa risposta .
  • Ringraziamo FranciscoPuga e questa risposta per avermi mostrato l' --followopzione.
  • Ringraziamo ChrisBetti per aver menzionato l' -n 1opzione e atatko per aver menzionato la -1variante.
  • Ringraziamo sweaver2112 per avermi fatto leggere la documentazione e capire cosa -p"significa" semanticamente.

6
Questa è stata un'ottima soluzione per me. Ho mostrato ogni commit e le sue differenze rispetto al file corrente quando ho eseguitogit log -p filename
Ian Jamieson,

4
Perfetto. Per vedere solo l'ultima modifica, è semplice come aggiungere il -n 1parametro. git log -p -n 1 filename
Chris Betti,

@ChrisBetti Grazie; L'ho incorporato nella mia risposta!
Kyle Strand

1
-n 1può anche essere sostituito da -1, non cambia il risultato Preferisco solo la sintassi:git log -p -1 filename
atatko

1
c'è un'utile opzione "--skip = [n]". È possibile digitare git log -p -1 --skip=1 <path>per visualizzare il secondo commit.
Maciek Łoziński,

220

Uno dei modi per usare git diff è:

git diff <commit> <path>

E un modo comune per riferire un commit dell'ultimo commit è come percorso relativo all'HEAD reale. Puoi fare riferimento a commit precedenti come HEAD ^ (nel tuo esempio questo sarà 123abc) o HEAD ^^ (456def nel tuo esempio), ecc ...

Quindi la risposta alla tua domanda è:

git diff HEAD^^ myfile

6
Oh, certo. Ci ho provato HEAD^, ma ovviamente non ha prodotto nulla. Non ho pensato di provare HEAD^^.
Chowlett,

17
Sintassi forse più semplice per commit molto tempo fa:HEAD~2
ibizaman

19
Non è vero (almeno per Git 1.9.0) che HEAD^^ myfilefarà effettivamente riferimento al penultimo commit che è cambiato myfile; farà riferimento al penultimo commit complessivo. Esiste un modo per specificare "Voglio vedere l'ultima modifica apportata a questo file" senza specificare (parte di) l'hash di commit o contare il numero di commit tra l'ultima modifica apportata a quel file e la revisione corrente?
Kyle Strand

3
Hm, sembra che git log -psia abbastanza vicino.
Kyle Strand

30
motivo del downvote: la domanda si pone "tra un file specifico come esiste ora e come esisteva prima dell'ultimo commit che lo ha cambiato ", ma se il file non è stato modificato nell'ultimo commit generale, questa risposta non funziona.
Chris Betti,

8

Se stai bene usando uno strumento grafico, funziona molto bene:

gitk <file>

gitk ora mostra tutti i commit in cui il file è stato aggiornato. Contrassegnare un commit mostrerà il diff rispetto al commit precedente nell'elenco. Questo funziona anche per le directory, ma poi puoi anche selezionare il file da diff per il commit selezionato. Super utile!


1
Molto utile anche: git difftool HEAD^ fileoppuregit difftool -d HEAD^ path
ForeverLearning
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.