¿Cómo puedo extraer un único archivo (o los cambios a un archivo) de un git stash?

StackOverflow https://stackoverflow.com/questions/1105253

  •  12-09-2019
  •  | 
  •  

Pregunta

Me gustaría saber si es posible extraer un único archivo o diff de un archivo desde un git stash sin hacer estallar el alijo conjunto de cambios fuera.

Podría alguien ser capaz de proporcionar algunas sugerencias/ideas acerca de esto?

¿Fue útil?

Solución

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

Un alijo es representado como un commit cuyo árbol registra el estado de la directorio de trabajo, y su primer padre es el comprometerse en la CABEZA cuando el alijo fue creado.

Así que usted puede tratar de stash (por ejemplo, stash@{0} es la primera / superior stash) como una combinación de cometer, y uso:

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

Explicación: stash@{0}^1 significa que el primer padre de la caleta, que como se indicó en la explicación anterior es la confirmación en la que los cambios fueron guardados.Utilizamos esta forma de "git diff" (con dos commits) porque stash@{0} / refs/stash es una combinación de cometer, y tenemos que decirle a git que los padres queremos diff contra.Más críptico:

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

también debe trabajar (ver git rev-parse manual para la explicación de rev^! la sintaxis, en "Especificar los rangos de" de la sección).

Asimismo, puede utilizar git checkout para comprobar un único archivo de salida de la mercancía:

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

o guardarlo con otro nombre de archivo:

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

o

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

(nota que aquí <full filename=""> es la ruta de acceso completa de un archivo con respecto a la parte superior de directorio de un proyecto (piensa:en relación a stash@{0})).


Usted puede ser que necesite para proteger stash@{0} a partir de la expansión de la shell, es decir,uso "stash@{0}" o 'stash@{0}'.

Otros consejos

Si utiliza git stash apply en lugar de git stash pop, se aplicará el alijo a su árbol de trabajo, pero aún así mantener el alijo.

Una vez hecho esto, se puede add / commit el archivo que desea y luego restablecer los cambios restantes.

Respuesta corta

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

Para ver la lista de cambios: git diff stash@{0}^1 stash@{0} -- <filename>

Hay una manera fácil de conseguir cambios de cualquier rama, incluyendo stashes:

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

Se puede omitir la especificación de archivo si desea aplicar un parche en muchas partes. O parche omitir (pero no el camino) para obtener todos los cambios en un solo archivo. Reemplazar 0 con el número alijo de git stash list, si tiene más de uno. Tenga en cuenta que esto es como diff, y ofrece a aplicar todos diferencias entre las ramas. Para conseguir cambios de un solo comprometerse / escondite, echar un vistazo a git cherry-pick --no-commit.

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

Notas:

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

  2. Sustituir cero(0) con su específica alijo de número.Para obtener alijo de lista, utilice:

    git stash list
    

Basado en Jakub Narębski la respuesta -- Versión más corta

Usted puede obtener el diff de un alijo con "git show stash@{0}" (o cualquiera que sea el número del alijo es; consulte "Lista de alijo git"). Es fácil de extraer la sección del diff para un solo archivo.

El concepto más simple de entender, aunque quizás no es el mejor, es que haya cambiado tres archivos y desea para guardar un archivo.

Si git stash para guardar todos ellos, git stash apply para traerlos de vuelta otra vez y luego git checkout f.c sobre el archivo en cuestión para restablecer eficazmente.

Cuando se desea que unstash archivo de ejecución hacer un git reset --hard y luego ejecutar git stash apply de nuevo, aprovechando deEl hecho de que git stash apply no borra el diff de la pila alijo.

Si los archivos escondidos necesitan fusionarse con la versión actual a fin de utilizar las formas anteriores usando diff. De lo contrario podría utilizar para git pop unstashing ellos, git add fileWantToKeep para la estadificación de su archivo, y hacer un git stash save --keep-index, para esconder todo, excepto lo que está en el escenario. Recuerde que la diferencia de esta manera con los anteriores es que "salta" el archivo de escondite. Las respuestas anteriores mantienen git checkout stash@{0} -- <filename> lo que va de acuerdo a sus necesidades.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top