2014-10-16 11 views
6

Quello che voglio è qualcosa di simile -
git checkout FHEAD~ path/filenameEsiste una scorciatoia per la versione precedente di un file in Git?

Quello che attualmente faccio è trovare la versione precedente del file via -
git log -1 --skip=1 path/filename

e poi,
git checkout <previous-commit-hash> path/filename

+0

Cosa stai chiedendo qui? Un alias per verificare la versione di un file che è registrato in un genitore di 'HEAD'? Si prega di precisare. – Jubobs

+0

Inoltre, qual è 'FHEAD'? – Jubobs

+2

@Jubobs La domanda mi sembra abbastanza chiara: trova la versione precedente di un file specifico, dove "precedente" significa "il modo in cui era appena prima dell'ultimo commit che ha modificato quel file" (e ignorando altri commit che non cambiano quel file). – hvd

risposta

0

banale esempio di un alias per recuperare la versione precedente di un file.

Il trucco è quello di formattare l'output di log con --format solo tornare l'hash commettere

[alias] 
    prev = "!f(){ git checkout $(git log -1 --format="%H" --skip=1 -- ${GIT_PREFIX:-.}/$1) -- ${GIT_PREFIX:-.}/$1; git reset ${GIT_PREFIX:-}/$1; }; f" 

L'utilizzo di git log -1 assicura che git prev restituisce sempre il file principale immediato. La selezione del genitore successivo può essere più complessa.

Si noti inoltre che il file, una volta estratto, viene immediatamente aggiunto all'indice. Non è unito alla copia esistente e non avvisa di sovrascrivere le modifiche locali. Ho incluso una chiamata a git-reset per garantire che il file di estrazione sia presente solo nella directory di lavoro e non nell'indice.

L'utilizzo di GIT_PREFIX consente di immettere percorsi relativi, sebbene solo versioni relativamente recenti di git supportino GIT_PREFIX.

Edit ..

stessa cosa usando git rev-list .. un comando git molto potente progettato per attraversare git grafici ascendenza quando lo scripting e l'automazione ...

[alias] 
    prev = "!f(){ git checkout $(git rev-list --max-count=1 --skip=1 HEAD -- ${GIT_PREFIX:-.}/$1) -- ${GIT_PREFIX:-.}/$1; git reset ${GIT_PREFIX:-}/$1; }; f" 
+1

Oppure usa 'rev-list' invece di' log' per lo scripting! – knittl

+0

Certo, perché no. 'git rev-list --max-count = 1 --skip = 1 HEAD - $ {GIT_PREFIX: -.}/$ 1' può sostituire il log git e produrre lo stesso risultato. – Dave

Problemi correlati