git-checkout ancienne révision d'un fichier sous un nouveau nom


264

J'ai le fichier " main.cpp" ouvert dans mon éditeur.

Je veux aussi voir la révision précédente de " main.cpp" dans l'éditeur.

La façon dont je le fais maintenant est comme ça.

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

Peut-il être simplifié, donc je n'ai pas à fermer "main.cpp" dans l'éditeur?

Ce que j'espère, c'est une variante git-checkoutqui peut le faire.


MISE À JOUR: im en utilisant git sur mac osx 10.5.7

prompt> git --version
git version 1.6.0.4
prompt> 

UPDATE2: Jakub Narębski réponse est:

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

UPDATE3: réponse de Karmi, pour une révision spécifique:

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

Quel éditeur utilisez-vous? Peut-être qu'il a un plugin / addon / module ajoutant le support pour Git?
Jakub Narębski

J'utilise textmate. Il a un support git, je n'ai pas vérifié si cela pouvait le faire.
neoneye

Textmate a le paquet git: github.com/timcharper/git-tmbundle (vous devriez avoir vérifié la page InterfacesFrontendsAndTools sur git wiki: git.or.cz/gitwiki )
Jakub Narębski

Soit dit en passant, l'interface VC dans Emacs (pour laquelle Git prend également en charge sous la forme de vc-git.el) a la commande «Afficher une autre version». Si TexMate Git Bundle (git-tmbundle) ne l'a pas, il vaudrait peut-être la peine de l'ajouter.
Jakub Narębski

J'utilise des liens symboliques pour mieux suivre mon projet dans TextMate. 25 dirs, 300 fichiers. Cela permet de masquer les répertoires de build et autres répertoires non pertinents. Cependant git / TextMate n'est pas trop content de ces liens symboliques, donc non :-(
neoneye

Réponses:


312

Vous pouvez utiliser "git show" pour cela:

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

(Notez qu'il y a deux points [ :] entre HEAD^et main.cpp.) La <revision>:<path>syntaxe est décrite dans la page de manuel git rev-parse , en avant-dernier point de la section "Spécification des révisions":

  • <rev>: <path>, par exemple HEAD: README,: README, master: ./ README

    Un suffixe :suivi d'un chemin nomme le blob ou l'arbre au chemin donné dans l'objet tree-ish nommé par la partie avant les deux points. :path(avec une partie vide avant les deux points) est un cas particulier de la syntaxe décrite ci-après: contenu enregistré dans l'index au chemin donné.

    Un chemin commençant par ./ou ../est relatif au répertoire de travail actuel. Le chemin donné sera converti pour être relatif au répertoire racine de l'arborescence de travail. Ceci est très utile pour adresser un blob ou une arborescence à partir d'une validation ou d'une arborescence ayant la même structure arborescente que l'arborescence de travail.

Notez que <path>voici le chemin COMPLET par rapport au répertoire supérieur de votre projet, c'est-à-dire le répertoire avec .git/répertoire. (Ou pour être plus exact à " <revision> " (qui en général peut être n'importe quel <tree-ish> , c'est-à-dire quelque chose qui représente un arbre))

Si vous souhaitez utiliser un chemin relatif au répertoire en cours, vous devez utiliser la ./<path>syntaxe (ou../path remonter du répertoire courant).

Modifier 2015-01-15: ajout d'informations sur la syntaxe du chemin relatif


Dans la plupart des cas, vous pouvez obtenir la même sortie en utilisant la commande de bas niveau (plomberie) git cat-file:

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

3
Je suis intéressé par une copie complète, mais git-show ne me montre que les différences .. J'ai essayé de jouer avec l'option --pretty .. prompt> git show --pretty = fuller HEAD ^ main.cpp mais il ne l'a pas fait ne le résous pas.
neoneye

7
"git show HEAD ^ main.cpp" (avec un espace entre HEAD ^ et main.cpp) est différent de "git show HEAD ^: main.cpp" (avec deux points ':' entre HEAD ^ et main.cpp).
Jakub Narębski

Hmm, avec deux points je vois cette erreur, donc j'ai pensé que le deux points était une erreur. Oui, il semble que le côlon est la voie à suivre, mais comment résoudre ce problème? prompt> git show HEAD ^: main.cpp fatal: argument ambigu 'HEAD ^: main.cpp': révision inconnue ou chemin d'accès absent de l'arborescence de travail. Utilisez '-' pour séparer les chemins de l'invite de révisions>
neoneye

2
Cela signifie probablement que vous avez donné un mauvais PATHNAME (malheureusement à cause de "git show", magic git ne peut pas donner un meilleur message d'erreur). Il doit s'agir du chemin d'accès COMPLET par rapport au répertoire supérieur de votre projet: $ (git ls-tree -r --name-only HEAD ^ | grep main.cpp)
Jakub Narębski

3
Au lieu du chemin complet, à partir des documents: "Un chemin commençant par ./ ​​ou ../ est relatif au répertoire de travail actuel." Fonctionne sur ma version 1.8.5.
LVB

24

Juste pour ajouter à la réponse de Jakub: vous n'avez même pas besoin de rediriger la sortie vers un fichier avec >, si vous êtes uniquement intéressé à parcourir le contenu du fichier dans le terminal. Vous pouvez simplement courir $ git show 58a3db6:path/to/your/file.txt.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.