git: Come diffondere i file modificati rispetto alle versioni precedenti dopo un pull?


117

Quando eseguo "git pull" spesso voglio sapere cosa è cambiato tra l'ultima versione di un file e quella nuova. Diciamo che voglio sapere cosa qualcun altro ha impegnato in un particolare file.

Come si fa?

Suppongo che sia "git diff" con alcuni parametri per commit x rispetto a commit y, ma non riesco a ottenere la sintassi. Trovo anche "git log" un po 'confuso e non sono sicuro di dove ottenere l'ID di commit della mia ultima versione del file rispetto a quella nuova.


1
Potresti trovare lo strumento grafico gitk più adatto ai tuoi gusti.
crazyscot

stackoverflow.com/questions/61002/… potrebbe essere simile a questo
VonC

Risposte:


158

Ci sono tutti i tipi di modi meravigliosi per specificare i commit - vedere la sezione sulla specifica delle revisioniman git-rev-parse per maggiori dettagli. In questo caso, probabilmente vorrai:

git diff HEAD@{1}

Il @{1}significa "la posizione precedente del ref che ho specificato", in modo che restituisca quello che avevi controllato in precedenza - appena prima del pull. Puoi aggiungere HEADalla fine lì se hai anche alcune modifiche nel tuo albero di lavoro e non vuoi vedere le differenze per loro.

Non sono sicuro di cosa stai chiedendo con "l'ID di commit della mia ultima versione del file" - l '"ID" di commit (hash SHA1) è quell'esadecimale di 40 caratteri all'inizio di ogni voce nell'output di git log. È l'hash per l'intero commit, non per un determinato file. Non hai davvero mai bisogno di più - se vuoi diff solo un file attraverso il pull, fallo

git diff HEAD@{1} filename

Questa è una cosa generale: se vuoi conoscere lo stato di un file in un dato commit, specifica il commit e il file, non un ID / hash specifico per il file.


Il precedente post collegato di VonC dice essenzialmente la stessa cosa di questo, ma la spiegazione è un po 'diversa, quindi per ora lascio questo. (Usa anche @{1}come abbreviazione per HEAD@{1})
Cascabel

vero, ma mi piace anche la spiegazione. +1
VonC

Questo è esattamente quello che stavo cercando. Grazie per la spiegazione.
lucapette

+1 per quello che stavo cercando su Google. Sarebbe fantastico se questa fosse selezionata come risposta e
arrivasse in

@longda Se stai ordinando per voti (che pensavo fosse predefinito) dovrebbe essere già in alto.
Cascabel

57

Mi piace usare:

git diff HEAD^

O se voglio solo diff un file specifico:

git diff HEAD^ -- /foo/bar/baz.txt

5
-1: HEAD^è il commit genitore, non il commit precedentepull
CharlesB

1
Se HEADè un commit di unione, HEAD^è il primo commit genitore, quindi sì, può essere il commit prima del pull. Per ottenere l'altro genitore (per un'unione bidirezionale), usa HEAD^2. Ma poi, la risposta sopra non è davvero rispondere alla domanda in primo luogo, quindi lasciare il -1 ;-)
Michael Wild

Grazie per il chiarimento. Non ho letto la domanda con molta attenzione, poiché stavo cercando qualcos'altro su Google e questo link è apparso in alto nella pagina dei risultati. Ho pensato di intervenire visto che sono un nuovo utente e non ho karma (se è così che si chiama SO). Colpa mia =)
cadizm

3
@MichaelWild potrebbe non essere quello che il richiedente stava chiedendo, ma era quello che stavo cercando quando l'ho trovato. Mi è stato utile. Upvoting.
John Dvorak

Questo è ciò che fa TortoiseGit "Diff with previous version". Ed è quello che stavo cercando.
Fabien Haddadi

15

Se esegui una scala git pull, verrai "spostato rapidamente" o unirai un numero sconosciuto di commit dal repository remoto. Tuttavia, ciò accade come un'azione, quindi l'ultimo commit in cui ti trovavi immediatamente prima del pull sarà l'ultima voce nel reflog ed è possibile accedervi come HEAD@{1}. Ciò significa che puoi fare:

git diff HEAD@{1}

Tuttavia, ti consiglio caldamente che se questo è qualcosa che ti ritrovi a fare molto, dovresti prendere in considerazione solo di fare un git fetched esaminare il ramo recuperato prima di unirlo o ribasarlo manualmente su di esso. Ad esempio, se sei su master e stavi per inserire origin / master:

git fetch

git log HEAD..origin/master

 # looks good, lets merge

git merge origin/master

Buon uso di git loginvece di git diffqui (anche se la sintassi è un po 'incoerente tra ".." per git loge "..." per git diff;) +1 Vedi stackoverflow.com/questions/53569/… e stackoverflow.com/questions / 850607 /…
VonC

Fortunatamente se usi la sintassi ".." in un comando git diff, git "fa la cosa giusta".
CB Bailey
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.