Come diff diffondere un file in una versione arbitraria in Git?


324

Come posso fare per diffondere un file, ad esempio pom.xml, dal ramo master a una versione precedente arbitraria in Git?

Risposte:


347

Tu puoi fare:

git diff master~20:pom.xml pom.xml

... per confrontare la tua corrente pom.xmlcon quella di master20 revisioni fa tramite il primo genitore. È possibile sostituire master~20, ovviamente, con il nome dell'oggetto (SHA1sum) di un commit o uno dei molti altri modi per specificare una revisione .

Si noti che questo in realtà sta confrontando la vecchia pom.xmlcon la versione dell'albero di lavoro, non con la versione impegnata master. Se lo desideri, puoi invece procedere come segue:

git diff master~20:pom.xml master:pom.xml

12
Nota che questo non funziona solo per i file, ma funziona anche per (sotto) directory, per esempio git diff <revision>:foo/ HEAD:foo/.

2
Si noti inoltre che su Windows è necessario utilizzare barre rovesciate per le directory se si utilizza un identificatore di revisione o git ti darà un errore sul file / directory non esistente in quella revisione.
Dylan Nissley,

1
@DylanNissley o non ti darà alcun errore e nessuna diff. Questo è quello che vedo. In ogni caso, grazie per il suggerimento sull'uso di barre rovesciate anziché barre rovesciate.
Gary S.

Con i file di Windows ho trovato più semplice cambiare directory e quindi chiamare git diff master ~ 20: ./ pom.xml ./pom.xml
lloyd

Alcune versioni di git richiedono "-" tra <revision> e <path>
Josh

140
git diff <revision> <path>

Per esempio:

git diff b0d14a4 foobar.txt

non funziona per la versione 1.7.11 se il file non si trova nella directory corrente. Esempio: 'git diff f76d078 test / Config' produce "errore: impossibile accedere a 'test / f76d078'"
simpleuser il

1
@ user1663987 sufficiente passare un percorso completo relativo alla radice progetto git diff <revision> root/path/file.

1
test / Config è relativo alla radice (come in test è una sottodirectory della radice). ma allora il tuo esempio root / percorso / file sembrerebbe INCLUDERE la radice?
simpleuser,

41

Se vuoi vedere la differenza tra l'ultimo commit di un singolo file puoi fare:

git log -p -1 filename

Questo ti darà il diff del file in git, non sta confrontando il tuo file locale.


2
questo non restituisce nulla
Andrei Cristian Prodan,

@AndreiCristianProdan Allora non ci sono cambiamenti lì. È possibile incrementare -1passo dopo passo fino ad ottenere le modifiche.
Kaiser

Questo è molto carino. Ho creato una funzione bash che potrebbero essere utili: gitlog () { git log -${3:-p} -${2:-1} $1; } usate come: gitlog Rakefileo gitlog Rakefile 5e gitlog Rakefile 10 s. Il primo mostra un diff; il secondo mostra cinque differenze; il terzo mostra dieci --no-patch.
auxbuss,

18

Per vedere cosa è stato modificato in un file nell'ultimo commit:

git diff HEAD~1 path/to/file.

È possibile modificare il numero (~ 1) nell'n-esimo commit con cui si desidera diff.


Questa risposta è in realtà solo un caso specifico di questa risposta più generale , dove HEAD~1viene sostituita <revision>, il che rende questa risposta un duplicato.

1
questo non funziona! fatale: argomento ambiguo 'HEAD ~ 1': revisione sconosciuta o percorso non nell'albero di lavoro. Usa '-' per separare i percorsi dalle revisioni
Andrei Cristian Prodan,

Questa risposta è semplice e funzionale per me.
Douglas Frari,

6

Sintassi generica:

$git diff oldCommit..newCommit -- **FileName.xml > ~/diff.txt

per tutti i file denominati "NomeFile.xml" in qualsiasi punto del repository.

Notare lo spazio tra "-" e "**"

Risposta per la tua domanda:

$git checkout master
$git diff oldCommit..HEAD -- **pom.xml 
or
$git diff oldCommit..HEAD -- relative/path/to/pom.xml 

come sempre con git, puoi usare un tag / sha1 / "HEAD ^" per identificare un commit.

Testato con git 1.9.1 su Ubuntu.


6

Se nessuno dei due commit è HEAD, l' espansione del controvento di bash si rivela davvero utile, specialmente se i nomi dei file sono lunghi, l'esempio sopra:

git diff master~20:pom.xml master:pom.xml

Potrebbe diventare

git diff {master~20,master}:pom.xml

Altro sull'espansione di Brace con bash.


6

Per comparare a 5 commit a quello attuale, entrambi attivi master, basta semplicemente:

git diff master~5:pom.xml master:pom.xml

Inoltre puoi fare riferimento al numero hash di commit, ad esempio se il numero hash è x110bd64, puoi fare qualcosa del genere per vedere la differenza:

git diff x110bd64 pom.xml


2
git diff master~20 -- pom.xml

Funziona se non sei anche nel ramo principale.


2

Se stai bene usando uno strumento grafico (o addirittura lo preferisci) puoi:

gitk pom.xml

In gitk puoi quindi fare clic su qualsiasi commit (per "selezionarlo") e fare clic con il pulsante destro del mouse su qualsiasi altro commit per selezionare "Diff this -> selezionato" o "Diff selezionato -> questo" nel menu a comparsa, a seconda dell'ordine che preferisci.



0

Ad esempio, se hai bisogno di diff su un singolo file in una scorta, puoi farlo

git diff stash@{0} -- path/to/file

-1

Se stai cercando il diff su un commit specifico e vuoi usare l'interfaccia utente github invece della riga di comando (supponi di voler collegarlo ad altre persone), puoi fare:

https://github.com/<org>/<repo>/commit/<commit-sha>/<path-to-file>

Per esempio:

https://github.com/grails/grails-core/commit/02942c5b4d832b856fbc04c186f1d02416895a7e/grails-test-suite-uber/build.gradle

Nota i collegamenti Precedente e Successivo in alto a destra che ti consentono di navigare attraverso tutti i file nel commit.

Questo funziona solo per un commit specifico, non per il confronto tra due versioni arbitrarie.

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.