2009-05-20 9 views
188

J'ai le fichier "main.cpp" ouvert dans mon éditeur.git-checkout ancienne révision d'un fichier sous un nouveau nom

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

La façon dont je le fais maintenant est comme ça. Peut-il être simplifié, donc je ne dois pas fermer "main.cpp" dans l'éditeur? Ce que j'espère, c'est une variante de git-checkout qui peut le faire.


MISE À JOUR: im en utilisant git sur Mac OS X 10.5.7

prompt> git --version 
git version 1.6.0.4 
prompt> 

MAJ2: réponse Jakub Narębski est:

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

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

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

Quel éditeur utilisez-vous? Peut-être qu'il a plugin/addon/module ajoutant le support pour Git? –

+0

J'utilise textmate. Il a un certain soutien de git, je n'ai pas vérifié si il peut le faire. – neoneye

+0

Textmate a git bundle: http://github.com/timcharper/git-tmbundle (vous devriez avoir consulté la page InterfacesFrontendsAndTools sur le wiki git: http://git.or.cz/gitwiki/) –

Répondre

211

Vous pouvez utiliser "git show" pour que:

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

(Notez qu'il ya deux points caractère ':' entre HEAD^ et main.cpp`.) Le «< révision >: <chemin> "syntaxe est décrite dans git rev-parse manpage, à côté de dernier point dans la section "Définition des révisions":

  • <rev>: <chemin>, par exemple TETE: README,: README, maître: ./ README

    Un suffixe : suivi d'un nom de chemin d'accès du blob ou de l'arbre dans le chemin donné dans l'objet de l'arbre-ish nommé par la partie avant du côlon. :path (avec une partie vide avant le deux-points) est un cas particulier de la syntaxe décrite ensuite: 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'arbre de travail. Ceci est très utile pour adresser un blob ou un arbre à partir d'un commit ou d'un arbre ayant la même structure arborescente que l'arbre de travail.

Notez que "<chemin>" est ici COMPLET chemin relatif au répertoire haut de votre projet, à savoir le répertoire avec le répertoire .git/. (Ou, pour être plus exact de « < révision > » (qui en général peut être tout < arbre-ish >, à savoir quelque chose qui représente l'arbre))

Si vous voulez utiliser le chemin par rapport au courant répertoire, vous devez utiliser la syntaxe "./ <chemin>" (ou "../ <chemin>" pour remonter du répertoire courant).

Modifier 15/01/2015: a ajouté des informations sur la syntaxe de chemin relatif


Vous pouvez obtenir dans la plupart des cas, la même sortie à l'aide de bas niveau (plomberie) commande 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 invite> git show --pretty = fuller HEAD^main.cpp – neoneye

+4

"git Afficher HEAD^main.cpp" (avec l'espace entre HEAD^et main.cpp) est DIFFERENT de "git show HEAD ^: main.cpp" (avec _colon_: 'entre HEAD^et main.cpp) –

+0

Hmm, avec le colon je vois cette erreur, donc je pensais que le colon était une erreur. comme le colon est le chemin à parcourir, mais comment puis-je résoudre ce problème? prompt> git afficher HEAD ^: main.cpp fatal: argument ambigu 'HEAD ^: main.cpp': révision inconnue ou chemin non t dans l'arbre de travail.Utilisez '-' pour séparer les chemins des révisions prompt> – neoneye

19

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 seulement intéressé par écrémage du fichier contenu dans le terminal. Vous pouvez simplement exécuter $ git show 58a3db6:path/to/your/file.txt.

+1

Je pense que vous n'avez pas besoin de commencer slash dans cette commande 'git show 58a3db6: chemin/to/votre/fichier.txt' –

0

La commande git show ne fonctionnait pas non plus pour moi (en utilisant 1.6.4.msysgit). Peut-être quelque chose à voir avec le caractère séparateur de chemin Windows?

J'ai fini par télécharger et utiliser QGit .... beaucoup plus facile!

+1

Je suis passé à cygwin git mais j'étais sur msysgit pendant un moment et j'ai remarqué que des choses comme' git checkout HEAD^'ne fonctionne pas parce que le'^'a apparemment une signification spéciale dans une session cmd windows typique. Mais 'git checkout" HEAD^"' a fonctionné alors peut-être que vous pouvez faire quelque chose comme 'git cat-fichier blob" HEAD ^: main.cpp "' dans msysgit. – MatrixFrog

+1

'HEAD ^' est juste un alias pour 'HEAD ~ 1', ce dernier fonctionnera avec Windows. – Perleone

+0

Vous pouvez utiliser la tête ~ ... pas besoin de 1 – JoelFan

Questions connexes