git-checkout revisione precedente di un file con un nuovo nome


264

Ho il file " main.cpp" aperto nel mio editor.

Voglio vedere anche la precedente revisione di " main.cpp" nell'editor.

Il modo in cui lo faccio ora è così.

close "main.cpp" in the editor

prompt> mv main.cpp tmp
prompt> git checkout HEAD^ main.cpp
prompt> mv main.cpp old_main.cpp
prompt> mv tmp main.cpp
prompt>

open "main.cpp" and "old_main.cpp" in the editor

Può essere semplificato, quindi non devo chiudere "main.cpp" nell'editor?

Ciò che spero sia una variante di git-checkoutciò che può fare questo.


AGGIORNAMENTO: sto usando git su mac osx 10.5.7

prompt> git --version
git version 1.6.0.4
prompt> 

AGGIORNAMENTO2: Jakub Narębski risponde:

prompt> git show HEAD^:dir1/dir2/dir3/main.cpp > old_main.cpp
prompt>

AGGIORNAMENTO3: la risposta di Karmi, per una revisione specifica:

prompt> git show 4c274dd91dc:higgs/Higgs.xcodeproj/project.pbxproj > old_project.pbxproj
prompt> 

Quale editor usi? Forse ha plugin / addon / modulo che aggiunge il supporto per Git?
Jakub Narębski,

Uso il compagno di testo. Ha un po 'di supporto git, non ho controllato però se può farlo.
neoneye,

Textmate ha il pacchetto git: github.com/timcharper/git-tmbundle (dovresti aver controllato la pagina InterfacesFrontendsAndTools sulla wiki di git: git.or.cz/gitwiki )
Jakub Narębski

A proposito, l'interfaccia VC in Emacs (per la quale Git ha anche il supporto sotto forma di vc-git.el) ha il comando 'Show Other Version'. Se TexMate Git Bundle (git-tmbundle) non lo possiede, forse varrebbe la pena aggiungerlo.
Jakub Narębski,

Uso i collegamenti simbolici per tenere meglio traccia del mio progetto in TextMate. 25 dirs, 300 file. Questo aiuta a nascondere builddir e altre directory irrilevanti. Comunque git / TextMate non è molto contento di questi symlink, quindi no :-(
neoneye,

Risposte:


312

Puoi usare "git show" per questo:

prompt> git show HEAD^:main.cpp > old_main.cpp

(Notare che c'è un :carattere due punti [ ] tra HEAD^e main.cpp.) La <revision>:<path>sintassi è descritta nella manpage git rev-parse , vicino all'ultimo punto nella sezione "Specifica delle revisioni":

  • <rev>: <percorso>, ad esempio HEAD: README,: README, master: ./ README

    Un suffisso :seguito da un percorso nomina il BLOB o l'albero nel percorso specificato nell'oggetto albero-ish chiamato dalla parte prima dei due punti. :path(con una parte vuota prima dei due punti) è un caso speciale della sintassi descritta di seguito: contenuto registrato nell'indice nel percorso indicato.

    Un percorso che inizia con ./o ../è relativo alla directory di lavoro corrente. Il percorso specificato verrà convertito in modo che sia relativo alla directory principale dell'albero di lavoro. Questo è molto utile per indirizzare un blob o un albero da un commit o un albero che ha la stessa struttura ad albero dell'albero di lavoro.

Nota che <path>qui c'è il percorso COMPLETO relativo alla directory principale del tuo progetto, cioè la directory con .git/directory. (O per essere più esatti in " <revision> " (che in generale può essere qualsiasi <tregua> , cioè qualcosa che rappresenta l'albero))

Se si desidera utilizzare il percorso relativo alla directory corrente, è necessario utilizzare la ./<path>sintassi (o ../pathrisalire dalla directory corrente).

Modifica 15-01-2015: aggiunte informazioni sulla sintassi del percorso relativo


Nella maggior parte dei casi è possibile ottenere lo stesso output utilizzando il git cat-filecomando di basso livello (idraulico) :

prompt> git cat-file blob HEAD^:main.cpp > old_main.cpp

3
Sono interessato a una copia completa, ma git-show mi mostra solo le differenze .. Ho provato a giocare con l'opzione --pretty .. prompt> git show --pretty = full HEAD ^ main.cpp ma non lo ha fatto non risolverlo.
neoneye,

7
"git show HEAD ^ main.cpp" (con spazio tra HEAD ^ e main.cpp) è DIFFERENTE da "git show HEAD ^: main.cpp" (con i due punti : tra HEAD ^ e main.cpp).
Jakub Narębski,

Hmm, con i due punti vedo questo errore, quindi ho pensato che i due punti fossero un errore. Sì, sembra che il colon sia la strada da percorrere, ma come posso risolverlo? prompt> git show HEAD ^: main.cpp fatale: argomento ambiguo 'HEAD ^: main.cpp': revisione sconosciuta o percorso non nell'albero di lavoro. Utilizzare '-' per separare i percorsi dal prompt delle revisioni>
neoneye

2
Ciò probabilmente significa che hai dato PATHNAME sbagliato (purtroppo a causa di "git show" git magico non può dare un messaggio di errore migliore). Dovrebbe essere il percorso COMPLETO relativo alla directory principale del progetto: $ (git ls-tree -r --name-only HEAD ^ | grep main.cpp)
Jakub Narębski,

3
Invece del percorso completo, dai documenti: "Un percorso che inizia con ./ o ../ è relativo alla directory di lavoro corrente." Funziona sulla mia versione 1.8.5.
LVB,

24

Solo per aggiungere alla risposta di Jakub: non devi nemmeno reindirizzare l'output su un file >, se sei interessato solo a scremare il contenuto del file nel terminale. Puoi semplicemente correre $ git show 58a3db6:path/to/your/file.txt.

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.