Cómo unstash solo ciertos archivos?


He guardado mis cambios. Ahora quiero unstash solo algunos archivos del alijo. ¿Cómo puedo hacer esto?

 263
Author: alex, 2013-03-07

6 answers

Como se menciona a continuación, y se detalla en " ¿Cómo extraería un solo archivo (o cambios a un archivo) de un alijo de git?", puede aplicar uso git checkout o git show para restaurar un archivo específico.

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

(Como comentó por Jaime M., para ciertos shell como tcsh donde necesita escapar de los caracteres especiales, la sintaxis sería: git checkout 'stash@{0}' -- <filename>)

O para guardarlo bajo otro nombre de archivo:

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

(tenga en cuenta que aquí <full filename> es el nombre de ruta completo de un archivo relativo al directorio superior de un proyecto (piense: relativo a stash@{0})).

Yucer sugiere en los comentarios:

Si desea seleccionar manualmente los cambios que desea aplicar desde ese archivo:

git difftool stash@{0}..HEAD -- <filename>

Vivek agrega en los comentarios:

Parece que "git checkout stash@{0} -- <filename> " restaura la versión del archivo a partir del momento en que se realizó el alijo -- hace NO aplicar (solo) los cambios guardados para ese archivo.
Para hacer esto último:

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

(como comentó por peterflynn , es posible que necesite | git apply -p1 en algunos casos, eliminar una barra diagonal (p1) de las rutas de diferencias tradicionales)


Como se comentó: "unstash "(git stash pop), entonces:

  • agregue lo que desea mantener al índice (git add)
  • guarda el resto: git stash --keep-index

El último punto es lo que permite que guardes algún archivo mientras escondes otros.
Es ilustrado en "Cómo guardar un archivo de varios archivos que han cambiado".

 320
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-13 14:21:11
git checkout stash@{N} <File(s)/Folder(s) path> 

Eg. Para restaurar solamente ./prueba.c archivo y ./ incluir carpeta del último guardado,

git checkout stash@{0} ./test.c ./include
 104
Author: Balamurugan A,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-12 18:44:47

Creo que la respuesta de VonC es probablemente lo que quieres, pero aquí hay una manera de hacer un "git apply" selectivo:

git show stash@{0}:MyFile.txt > MyFile.txt
 33
Author: Mike Monkiewicz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-08 03:45:33

Si git stash pop (sin conflictos) eliminará el alijo después de que se aplique. Pero si git stash apply se aplicará el parche sin eliminarlo de la lista de alijos. Luego puede revertir los cambios no deseados con git checkout -- files...

 9
Author: Ben Jackson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-07 06:44:15

Primero listar todos los alijos

git stash list

stash@{0}: WIP on Produktkonfigurator: 132c06a5 Cursor bei glyphicon plus und close zu zeigende Hand ändern
stash@{1}: WIP on Produktkonfigurator: 132c06a5 Cursor bei glyphicon plus und close zu zeigende Hand ändern
stash@{2}: WIP on master: 7e450c81 Merge branch 'Offlineseite'

Luego muestra qué archivos están en el alijo:

git stash show stash@{1} --name-only

 ajax/product.php
 ajax/productPrice.php
 errors/Company/js/offlineMain.phtml
 errors/Company/mage.php
 errors/Company/page.phtml
 js/konfigurator/konfigurator.js

Luego aplica el archivo que quieras:

git checkout stash@{1} -- <filename>

O carpeta completa:

git checkout stash@{1} /errors

También funciona sin -- pero se recomienda usarlos. Ver este post.

También es convencional reconocer un doble guion como una señal para detener la interpretación de la opción y tratar todos los siguientes argumentos literalmente.

 4
Author: Black,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-04 11:01:37

Una manera más:

git diff stash@{N}^! -- path/to/file1 path/to/file2  | git apply -R
 2
Author: Lacho Tomov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-16 12:12:17