2013-01-22 11 views
16

posso facilmente scoprire che cosa è cambiato per un file dopo l'ultima impegnarsi con git diff HEAD^ -- <filename> ma c'è uno scorciatoia equivalente per visualizzare un diff per un determinato file dall'ultima impegnato, indipendentemente da quanti sono i commit da allora? O per tornare N commits di quel particolare file?Stenografia per vedere diff della versione precedente del file di

Contesto:. Ho trovato un errore in un file e voglio rintracciare quando furtivamente in E 'abbastanza facile da ottenere un rapporto di registro per un particolare file con git log -<n> <filename> per mostrare solo i commit che includevano modifiche a tale file. Quindi chiaramente posso semplicemente copiare e incollare gli SHA dal rapporto log, ma quello che voglio veramente è poter fare qualcosa come git diff^-- <filename> o git diff ~2 -- <filename>.

+2

Sei sicuro di non voler "dare la colpa"? –

risposta

34
$ git log -p <filename> 

mostrerà il messaggio di registro più un diff per ogni commit che ha toccato il file indicato.

per visualizzare solo le differenze rispetto alla versione precedente, chiedono solo ad un passo nella storia di registro:

$ git log -1 -p <filename> 
+1

Trovo strano che questa sembra essere la cosa più vicina a ciò che OP sta cercando, ma è comunque molto utile. Grazie. –

+0

@MattMcHenry Davvero bello. Ho modificato la tua risposta e aggiunto la sintassi per mostrare solo la modifica dell'ultimo commit, come richiesto in OP. –

1

git blame dovrebbe arrivare a destinazione piuttosto veloce.

3

È possibile utilizzare la formattazione git log per ottenere gli hash dei commit precedenti su un file. Ad esempio,

git log --pretty=format:'%h' -1 --skip=1 <filename> 

ti porterà il 2 ° di durare impegnarsi a toccare un file specifico. Infatti, se non si specifica un nome file, questo ti porterà il 2 ° all'ultimo commit sull'intero repository. Per ottenere gli hash più anziani, si potrebbe impostare un alias di git che chiama una funzione di shell, in questo modo:

[alias] 
    prior-hash = "!ph() { git log --pretty=format:'%h' -1 --skip=$1 $2; }; ph" 

Per usarlo, devi digitare qualcosa come git prior-hash n <filename>, dove n è il (n + 1) la versione più recente del file. Quindi 1 sarebbe il 2 ° per ultimo impegnare il file, 2 sarebbe il 3 ° a durare, ecc, e 0 sarebbe il commit più recente per toccare quel file. E ancora, il nome file è facoltativo, se si desidera esaminare il repository nel suo complesso.

Sono sicuro che si potrebbe capire come costruire un comando diff da lì:

[alias] 
    prior-hash = "!ph() { git log --pretty=format:'%h' -1 --skip=$1 $2; }; ph" 
    diff-prev-easy = "!dp() { git diff $(git prior-hash $1 $2).. $2; }; dp" 

che sarebbe utilizzato simile alla prima alias-hash, git diff-prev-easy n <filename>. Questo confronta la (n + 1) ultima revisione con la revisione più recente del file. Se si voleva confrontare invece la (n + 1) esimo ultima revisione al ennesima ultima revisione, si tratta di un semplice cambiamento:

[alias] 
    prior-hash = "!ph() { git log --pretty=format:'%h' -1 --skip=$1 $2; }; ph" 
    diff-prev = "!dp() { git diff $(git prior-hash $1 $2)..$(git prior-hash $(($1 - 1)) $2) $2; }; dp" 

che, ancora una volta, viene utilizzato allo stesso modo: git diff-prev n <filename>

Un potenziale il problema da tenere a mente, però, è che gli elenchi git log si impegna in ordine cronologico, il che potrebbe non essere quello che si desidera. Considerate questo la storia:

1 - 2 - - - 4 - 5 master 
     \  /
     3 - -  develop 

nostro comando git diff-prev 1 dovrebbe produrre il diff tra commettere 4 e 5, come previsto. Ma git diff-prev 2 mostrerebbe il diff tra commit 3 e 4, che è probabilmente indesiderabile.

+0

Non so dell'OP, ma questo è esattamente ciò di cui avevo bisogno. Grazie. –

Problemi correlati