unstash stash limpiar create cambios and git git-stash

limpiar - ¿Cómo puedo extraer un solo archivo(o cambios en un archivo) de un git stash?



limpiar stash git (8)

Respuesta corta

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

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

Me gustaría saber si es posible extraer un solo archivo o diff de un archivo de un alijo de git sin quitar el conjunto de cambios de alijo.

¿Alguien podría proporcionar algunas sugerencias / ideas sobre esto?


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

Si hace git stash para esconderlos todos, git stash apply para recuperarlos y luego git checkout fc en el archivo en cuestión para restablecerlo de manera efectiva.

Cuando quiera deshacer el archivo, ejecute un git reset --hard y luego ejecute git stash apply nuevamente, aprovechando el hecho de que git stash apply no borra la diferencia de la pila de stash.


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

Un stash se representa como un commit cuyo árbol registra el estado del directorio de trabajo, y su primer padre es el commit en HEAD cuando se creó el stash.

Por lo tanto, puede tratar el alijo (por ejemplo, el stash@{0} es el primer o mejor alijo) como un compromiso de fusión, y usar:

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

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

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

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

Del mismo modo, puede usar git checkout para retirar un solo archivo 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>

( tenga en cuenta que aquí <nombre de archivo completo> es la ruta completa de un archivo en relación con el directorio superior de un proyecto (piense: en relación con el stash@{0} )).

Es posible que deba proteger el stash@{0} de la expansión de shell, es decir, usar "stash@{0}" o ''stash@{0}'' .


Hay una forma fácil de obtener cambios desde cualquier sucursal, incluidos los escondites:

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

Puede omitir la especificación de archivo si desea parchear en muchas partes. O bien omita el parche (pero no la ruta) para obtener todos los cambios en un solo archivo. Reemplace 0 con el número de git stash list de git stash list , si tiene más de uno. Tenga en cuenta que esto es como diff , y ofrece aplicar todas las diferencias entre las ramas. Para obtener cambios de un solo commit / stash, eche un vistazo a git cherry-pick --no-commit .


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


Si los archivos ocultos necesitan fusionarse con la versión actual, use las formas anteriores usando diff. De lo contrario, podría usar git pop para desempañarlos, git add fileWantToKeep para git add fileWantToKeep 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 las anteriores es que "hace estallar" el archivo del alijo. Las respuestas anteriores se guardan en el git checkout stash@{0} -- <filename> para que se adapte a sus necesidades.


Si usa git stash apply lugar de git stash pop , aplicará el stash a su árbol de trabajo, pero conservará el stash.

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


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

Notas:

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

  2. Reemplace cero (0) con su número de alijo específico. Para obtener la lista de escondites, use:

    git stash list

Basado en share - Versión más corta