Pregunta ¿Cómo extraería un único archivo (o cambios en un archivo) de un alijo de git?


Me gustaría saber si es posible extraer un único archivo o una diferencia de un archivo de un alijo de git sin desactivar el conjunto de cambios oculto.

¿Podría alguien proporcionar algunas sugerencias / ideas sobre esto?


550
2017-07-09 17:12


origen


Respuestas:


En git escondite página de manual puede leer eso (en la sección "Discusión", justo después de la descripción de "Opciones"):

Un escondite se representa como un compromiso cuyo árbol registra el estado del    directorio de trabajo, y su primer padre es el compromiso en HEAD cuando el    escondite fue creado.

Para que pueda tratar el alijo (p. stash@{0} es el primer / último escondite) como un compromiso de fusión y uso:

$ git diff stash@{0}^1 stash@{0} -- <filename>

Explicación: stash@{0}^1 atajo significa el primer padre del alijo dado, que como se indica en la explicación anterior es el compromiso en el cual los cambios fueron escondidos. Usamos esta forma de "git diff" (con dos commits) porque stash@{0} / refs/stash es un compromiso de fusión, y tenemos que decirle a qué padre queremos diferenciarnos. Más críptico:

$ git diff stash@{0}^! -- <filename>

también debería funcionar (ver git rev-parse página de manual para explicación de rev^! sintaxis, en la sección "Especificar rangos").

Del mismo modo, puedes usar git pago y envío para verificar un solo archivo fuera del alijo:

$ git checkout stash@{0} -- <filename>

o para guardarlo bajo otro nombre de archivo:

$ git show stash@{0}:<full filename>  >  <newfile>

o

$ git show stash@{0}:./<relative filename> > <newfile>

(Nota que aquí <nombre de archivo completo> es la ruta de acceso completa de un archivo relativo al directorio superior de un proyecto (piense: relativo a stash@{0})).


Es posible que necesites proteger stash@{0} desde la expansión del caparazón, es decir, uso "stash@{0}" o 'stash@{0}'.


823
2017-07-09 18:21



Si utiliza git stash apply más bien que git stash pop, aplicará el alijo a su árbol de trabajo pero aún conservará el alijo.

Con esto hecho, puedes add/commit el archivo que desea y luego restablecer los cambios restantes.


32
2017-07-09 17:58



Respuesta corta

Para ver el archivo completo: git show stash@{0}:<filename>

Para ver el diff: git diff stash@{0}^1 stash@{0} -- <filename>


11
2017-12-22 13:05



Puedes obtener el diff para un alijo con "git show stash@{0}"(o cualquiera que sea el número del alijo, vea" git stash list "). Es fácil extraer la sección del diff para un solo archivo.


9
2017-07-09 17:42



Hay una manera fácil de obtener cambios de cualquier rama, incluidos los depósitos:

$ git checkout --patch stash@{0} path/to/file

Puede omitir la especificación del archivo si desea parchar en muchas partes. O omita el parche (pero no la ruta) para obtener todos los cambios en un solo archivo. Reemplazar 0 con el número de alijo de git stash listsi tienes más de uno Tenga en cuenta que esto es como diffy ofrece la aplicación todas diferencias entre las ramas. Para obtener cambios de solo un commit / stash, eche un vistazo a git cherry-pick --no-commit.


8
2018-06-26 03:20



El concepto más simple de entender, aunque tal vez no el mejor, es que tiene tres archivos modificados y quiere esconder un archivo.

Si lo haces git stash para esconderlos a todos, git stash apply traerlos de vuelta otra vez y luego git checkout f.c en el archivo en cuestión para restablecerlo efectivamente.

Cuando quiera destrabar ese archivo, ejecute un git reset --hard y luego corre git stash apply de nuevo, aprovechando el hecho de que git stash apply no borra el diff de la pila de alijo.


5
2017-07-19 15:36



$ git checkout stash@{0} -- <filename>

Notas:

  1. Asegúrese poner espacio después del "-" y el parámetro del nombre de archivo

  2. Reemplaza cero (0) con tu número específico de escondite. Para obtener una lista oculta, use:

    git stash list
    

Residencia en La respuesta de Jakub Narębski - Versión más corta


3
2017-09-08 05:53



Si los archivos escondidos deben fusionarse con la versión actual, utilice las formas anteriores utilizando diff. De lo contrario, podrías usar git pop para desatascarlos, git add fileWantToKeep para organizar su archivo, y hacer una git stash save --keep-index, por esconder todo excepto lo que está en el escenario. Recuerde que la diferencia de esta manera con las anteriores es que "saca" el archivo del escondite. Las respuestas anteriores lo mantienen git checkout stash@{0} -- <filename> así que va de acuerdo a tus necesidades.


1
2017-10-26 12:59