2009-05-20 9 views
188

Tengo el archivo "main.cpp" abierto en mi editor.git-checkout revisión anterior de un archivo con un nuevo nombre

Quiero ver la revisión anterior de "main.cpp" en el editor también.

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, por lo que no tiene que cerrar "main.cpp" en el editor?

Lo que estoy esperando es una variante de git-checkout que puede hacer esto.


ACTUALIZACIÓN: im usando Git en Mac OS X 10.5.7

prompt> git --version 
git version 1.6.0.4 
prompt> 

Update2: Jakub Narębski respuesta es:

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

Update3: La respuesta de Carmi, para una revisión específica:

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

¿Qué editor usas? ¿Quizás tiene complemento/complemento/módulo que agrega soporte para Git? –

+0

Uso textmate. Tiene cierto soporte de git, pero no he verificado si puede hacerlo. – neoneye

+0

Textmate tiene paquete de git: http://github.com/timcharper/git-tmbundle (deberías haber revisado la página InterfacesFrontistas y herramientas en la wiki de git: http://git.or.cz/gitwiki/) –

Respuesta

211

Puede utilizar "mostrar git" para ello:

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

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

  • <rev>: <camino>, por ejemplo CABEZA: README,: README, master: ./ README

    Un sufijo : seguido por unos nombres de ruta el BLOB o del árbol en la ruta dada en el objeto ish-árbol nombrado por la parte antes del colon. :path (con una parte vacía antes de los dos puntos) es un caso especial de la sintaxis que se describe a continuación: contenido registrado en el índice en la ruta dada.

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

Tenga en cuenta que "<ruta>" aquí es ruta completa en relación con el directorio superior de su proyecto, es decir, el directorio con .git/ directorio. (O, para ser más exacto "< revisión >" (que en general puede ser cualquier < ish-árbol >, es decir, algo que representa árbol))

Si desea utilizar la ruta relativa a la corriente directorio, necesita utilizar la sintaxis "./ <ruta>" (o "../ <ruta>" para ir desde el directorio actual).

Edición 01/15/2015: añade información sobre la sintaxis de ruta relativa


Usted puede obtener en la mayoría de los casos el mismo resultado utilizando de bajo nivel (fontanería) git cat-file comando:

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

Estoy interesado en una copia completa, pero git-show me muestra solo las diferencias .. He intentado jugar con la opción --pretty .. prompt> git show --pretty = fuller HEAD^main.cpp pero no lo resolvió – neoneye

+4

"git show HEAD^main.cpp" (con espacio entre HEAD^y main.cpp) es DIFERENTE de "git show HEAD ^: main.cpp" (con _colon_ ':' entre HEAD^y main.cpp). –

+0

Hmm, con dos puntos veo este error, así que pensé que el colon era un error. Sí, parece como dos puntos es el camino a seguir, pero ¿cómo puedo resolver esto? prompt> git show HEAD ^: main.cpp fatal: argumento ambiguo 'HEAD ^: main.cpp': revisión desconocida o ruta no t en el árbol de trabajo. Use '-' para separar las rutas de las revisiones prompt> – neoneye

19

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

+1

Creo que no es necesario iniciar la barra en este comando 'git show 58a3db6: ruta/a/su/archivo.txt' –

0

El comando 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!

+1

Cambié a cygwin git pero estuve en msysgit por un tiempo y noté que cosas como' git checkout HEAD^'no funciona porque el'^'aparentemente tiene un significado especial en una sesión típica de Windows cmd. Pero 'git checkout" HEAD^"' funcionó, así que tal vez puedas hacer algo como 'git cat-file blob 'HEAD ^: main.cpp' 'en msysgit. – MatrixFrog

+1

'HEAD ^' es solo un alias para 'HEAD ~ 1', este último funcionará con Windows. – Perleone

+0

Puede usar HEAD ~ ... sin necesidad de 1 – JoelFan

Cuestiones relacionadas