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

264

Tengo el archivo " 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

¿Se puede simplificar para que no tenga que cerrar "main.cpp" en el editor?

Lo que espero es una variante git-checkoutque 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: la respuesta de Karmi, para una revisión específica:

prompt> git show 4c274dd91dc:higgs/Higgs.xcodeproj/project.pbxproj > old_project.pbxproj
prompt> 
neoneye
fuente
¿Qué editor usas? ¿Quizás tiene complemento / complemento / módulo que agrega soporte para Git?
Jakub Narębski
Yo uso textmate. Tiene cierto soporte de git, aunque no he comprobado si puede hacerlo.
neoneye
Textmate tiene git bundle: github.com/timcharper/git-tmbundle (debería haber revisado la página InterfacesFrontendsAndTools en git wiki: git.or.cz/gitwiki )
Jakub Narębski
Por cierto, la interfaz VC en Emacs (para la cual Git también tiene soporte en forma de vc-git.el) tiene el comando 'Mostrar otra versión'. Si TexMate Git Bundle (git-tmbundle) no lo tiene, quizás valga la pena agregarlo.
Jakub Narębski
Utilizo enlaces simbólicos para realizar un mejor seguimiento de mi proyecto en TextMate. 25 directorios, 300 archivos. Esto ayuda a ocultar builddirs y otros directorios irrelevantes. Sin embargo, git / TextMate no está muy contento con estos enlaces simbólicos, así que no :-(
neoneye

Respuestas:

312

Puedes usar "git show" para eso:

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

(Tenga en cuenta que hay dos puntos [ :] entre HEAD^y main.cpp.) La <revision>:<path>sintaxis se describe en la página de manual de git rev-parse , junto al último punto en la sección "Especificación de revisiones":

  • <rev>: <path>, p. ej. HEAD: README,: README, master: ./ README

    Un sufijo :seguido de una ruta nombra el blob o árbol en la ruta dada en el objeto 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 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 <path>aquí hay una ruta COMPLETA en relación con el directorio superior de su proyecto, es decir, el directorio con el .git/directorio. (O para ser más exactos a " <revision> " (que en general puede ser cualquier <tree-ish> , es decir, algo que representa un árbol))

Si desea usar la ruta relativa al directorio actual, debe usar la ./<path>sintaxis (o ../pathsubir desde el directorio actual).

Editar 2015-01-15: se agregó información sobre la sintaxis de ruta relativa


En la mayoría de los casos, puede obtener la misma salida con el git cat-filecomando de bajo nivel (plomería) :

prompt> git cat-file blob HEAD^:main.cpp > old_main.cpp
Jakub Narębski
fuente
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 No lo resuelvas.
neoneye
77
"git show HEAD ^ main.cpp" (con espacio entre HEAD ^ y main.cpp) es DIFERENTE de "git show HEAD ^: main.cpp" (con dos puntos ':' entre HEAD ^ y main.cpp).
Jakub Narębski
Hmm, con el colon veo este error, así que pensé que el colon era un error. Sí, parece que colon es el camino a seguir, pero ¿cómo resuelvo esto? prompt> git show HEAD ^: main.cpp fatal: argumento ambiguo 'HEAD ^: main.cpp': revisión desconocida o ruta que no está en el árbol de trabajo. Use '-' para separar las rutas de las solicitudes de revisión>
neoneye
2
Eso probablemente significa que has dado PATHNAME incorrecto (desafortunadamente debido a "git show" magic git no puede dar un mejor mensaje de error). Debe ser una ruta COMPLETA en relación con el directorio superior de su proyecto: $ (git ls-tree -r --name-only HEAD ^ | grep main.cpp)
Jakub Narębski
3
En lugar de la ruta completa, desde los documentos: "Una ruta que comienza con ./ o ../ es relativa al directorio de trabajo actual". Funciona en mi versión 1.8.5.
LVB
24

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

karmi
fuente