git-checkout revisión anterior de un file con un nuevo nombre

Tengo el file " main.cpp " abierto en mi editor.

También quiero ver la revisión anterior de " main.cpp " en el editor.

La forma en que lo hago ahora es así.

 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 

¿Puede simplificarse, así que no tengo que cerrar "main.cpp" en el editor?

Lo que espero es una variante de git-checkout que pueda hacer esto.


ACTUALIZACIÓN: estoy usando git en mac osx 10.5.7

 prompt> git --version git version 1.6.0.4 prompt> 

ACTUALIZACIÓN2: la respuesta de Jakub Narębski es:

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

ACTUALIZACIÓN3: respuesta de Karmi, para una revisión específica:

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

Puedes usar "git show" para eso:

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

(Tenga en count que hay dos puntos ' : ' carácter entre HEAD^ y main.cpp`.) La syntax " <revisión> : <ruta> " se describe en la página de manual de git rev-parse , junto al último punto en "Especificación de revisiones" sección:

  • <rev>: <ruta de acceso>, p. ej. HEAD: README,: README, master: ./ README

    Un sufijo : seguido de una ruta de nombres del blob o tree en la ruta dada en el object tree-ish nombrado por la parte antes de los dos puntos. :path (con una parte vacía antes de los dos puntos) es un caso especial de la syntax que se describe a continuación: contenido registrado en el índice en la ruta determinada.

    Una ruta que comienza con ./ o ../ es relativa al directory de trabajo actual. La ruta dada se convertirá para ser relativa al directory raíz del tree de trabajo. Esto es más útil para abordar un blob o tree de un commit o tree que tiene la misma estructura de tree que el tree de trabajo.

Tenga en count que " <ruta de acceso> " aquí es FULL path relativa al directory superior de su proyecto, es decir, el directory con el directory .git/ . (O para ser más exactos que " <revisión> " (que en general puede ser cualquier <tree-ish> , es decir, algo que representa un tree))

Si desea usar la ruta relativa al directory actual, necesita usar la syntax "./ <ruta de acceso>" (o "../ <ruta de acceso>" para ir desde el directory actual).

Editar 2015-01-15: información adicional sobre la syntax de la ruta relativa


En la mayoría de los casos, puede get el mismo resultado utilizando el command git cat-file bajo nivel (plomería):

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

Solo para agregar a la respuesta de Jakub: ni siquiera tiene que networkingirigir la salida a un file con > , si solo está interesado en escanear el contenido del file en la terminal. Solo puede ejecutar $ git show 58a3db6:path/to/your/file.txt .

El command git show tampoco funcionó para mí (usando 1.6.4.msysgit). Tal vez algo que ver con el carácter separador de ruta de Windows?

Terminé simplemente descargando y usando QGit … ¡mucho más fácil!