2010-03-11 7 views
90

Quando eseguo "git pull", spesso desidero sapere cosa è cambiato tra l'ultima versione di un file e quella nuova. Diciamo che voglio sapere che cosa qualcun altro ha commesso su un particolare file.git: Come diffare i file modificati rispetto alle versioni precedenti dopo un pull?

Come è fatto?

Suppongo che sia "git diff" con alcuni parametri per commit x contro commit y ma non riesco a ottenere la sintassi. Trovo anche "git log" che confonde un po '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

+0

http://stackoverflow.com/questions/61002/how-can-i-generate-a-git-diff-of-whats-changed-since-the-last-time-i-pulled potrebbe essere simile a questo – VonC

risposta

124

Ci sono tutti i tipi di modi meravigliosi per specificare i commit: vedere la sezione di man git-rev-parse per ulteriori dettagli. In questo caso, probabilmente si desidera:

git diff [email protected]{1} 

I @{1} significa "la posizione precedente del ref ho specificato", in modo che restituisce quello che aveva controllato in precedenza - poco prima del tiro. È possibile aggiungere HEAD alla fine se si dispone anche di alcune modifiche nell'albero di lavoro e non si desidera visualizzare le differenze per esse.

Non sono sicuro di quello che chiedi con "l'ID di commit della mia ultima versione del file" - il commit "ID" (hash SHA1) è quell'esagono di 40 caratteri proprio nella parte superiore di ogni entrata nell'output di git log. È l'hash per l'intero commit, non per un dato file. Non è davvero mai bisogno di più - se si vuole diff solo file attraverso il tiro, fare

git diff [email protected]{1} filename 

Questa è una cosa generale - se si desidera conoscere lo stato di un file in una determinata commettere , si specifica il commit e il file, non un ID/hash specifico per il file.

+0

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

+0

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

+0

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

11

Se si esegue una scala git pull, si verrà "inoltrati rapidamente" o si unirà un numero sconosciuto di commit dall'archivio remoto. Ciò avviene come un'azione, anche se l'ultimo commit che eravate immediatamente prima del pull sarà l'ultima voce nel reflog e sarà accessibile come [email protected]{1}. Questo significa che si può fare:

git diff [email protected]{1} 

Tuttavia, vi consiglio vivamente che se questo è qualcosa che si ritrovi a fare un sacco allora si dovrebbe prendere in considerazione solo facendo un git fetch ed esaminando il ramo inverosimile prima di fondersi manualmente o rebasing su esso. Per esempio. se siete su master e stavano per tirare in origin/master:

git fetch 

git log HEAD..origin/master 

# looks good, lets merge 

git merge origin/master 
+0

Un bel uso di 'git log' invece di' git diff' qui (anche se la sintassi è un po 'incoerente tra' .. 'per 'git log' e' ... 'per' git diff';) + 1 Vedi http://stackoverflow.com/questions/53569/how-to-get-the-changes-on-a-branch-in-git/53573#53573 e http://stackoverflow.com/questions/850607/ differenza-in-git-log-origine-master-vs-git-log-origine-master/850695 # 850695 – VonC

+0

Fortunatamente se si utilizza la sintassi '..' in un comando git diff git "fa la cosa giusta". –

42

Mi piace usare:

git diff HEAD^ 

O se solo voglio diff un file specifico:

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

-1: 'HEAD ^' è il commit genitore, non il commit prima di 'pull' – CharlesB

+0

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

+0

Grazie per i chiarimenti. Non ho letto la domanda con molta attenzione, dato che cercavo qualcos'altro e questo link è apparso in alto nella pagina dei risultati. Ho pensato di farmi sentire perché sono un nuovo utente e non ho alcun karma (se è così che viene chiamato SO). Colpa mia =) – cadizm

Problemi correlati