Me escondí mis cambios. Ahora quiero eliminar solo algunos archivos del alijo. ¿Cómo puedo hacer esto?
Me escondí mis cambios. Ahora quiero eliminar solo algunos archivos del alijo. ¿Cómo puedo hacer esto?
Respuestas:
Como se menciona a continuación , y se detalla en " ¿Cómo extraería un solo archivo (o cambios a un archivo) de un git stash? ", Puede aplicar el uso git checkout
o git show
restaurar un archivo específico.
git checkout stash@{0} -- <filename>
Eso sobrescribe filename
: asegúrese de no tener modificaciones locales, o tal vez desee fusionar el archivo escondido en su lugar .
(Como se ha comentado por Jaime M. , por cierto cáscara como tcsh donde tiene que escapar los caracteres especiales, la sintaxis sería: git checkout 'stash@{0}' -- <filename>
)
o para guardarlo con otro nombre de archivo:
git show stash@{0}:<full filename> > <newfile>
(tenga en cuenta que aquí
<full filename>
está el nombre de ruta completo de un archivo relativo al directorio superior de un proyecto (piense: relativo astash@{0}
)).
yucer sugiere en los comentarios :
Si desea seleccionar manualmente qué cambios 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 en el momento en que se realizó el alijo - NO aplica (solo) los cambios escondidos para ese archivo.
Para hacer esto último:
git diff stash@{0}^1 stash@{0} -- <filename> | git apply
(como se ha comentado por peterflynn , puede ser necesario | git apply -p1
en algunos casos, la eliminación de uno ( p1
) barra inicial de los caminos tradicionales diff)
Como comentó: "unstash" ( git stash pop
), entonces:
git add
)git stash --keep-index
El último punto es lo que le permite mantener algunos archivos mientras guarda otros.
Se ilustra en " Cómo guardar solo un archivo de varios archivos que han cambiado ".
git stash pop
debido a conflictos de archivos. La respuesta de Balamurugan A me sirvió en ese caso.
unstash
significa pop
, como me parece que probablemente lo haría en la mayoría de los casos, esto solo responde parcialmente a la pregunta. ¿Cómo se eliminan las piezas aplicadas selectivamente del alijo para evitar conflictos y / o confusión posteriores al hacer estallar los cambios restantes?
git checkout stash@{N} <File(s)/Folder(s) path>
P.ej. Para restaurar solo el archivo ./test.c y la carpeta ./include desde el último escondite,
git checkout stash@{0} ./test.c ./include
-a
bandera al crear el alijo.
Creo que la respuesta de VonC es probablemente lo que quieres, pero aquí hay una forma de hacer una "aplicación git" selectiva:
git show stash@{0}:MyFile.txt > MyFile.txt
checkout
nada.
git show stash@`{0`}:Path/To/MyFile.txt |sc Path/To/MyFile.txt
- los backticks son necesarios para que PS no interprete los corchetes especialmente, y sc
es necesario porque el >
operador de PS tiene por defecto UTF-16 (en realidad UCS-2), que probablemente no sea lo que desea. La respuesta de @Balamurugan A no sufre estos problemas.
Primero lista todos los escondites
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 muestre qué archivos están en el alijo (seleccionemos el alijo 1):
git stash show 1 --name-only
//Hint: you can also write
//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 aplique el archivo que desea:
git checkout stash@{1} -- <filename>
o carpeta completa:
git checkout stash@{1} /errors
También funciona sin, --
pero se recomienda usarlos. Ver esta publicación
También es convencional reconocer un guión doble como una señal para detener la interpretación de opciones y tratar todos los argumentos siguientes literalmente.
git stash pop
arrojó un error para los archivos no rastreados. gracias.
Si usted git stash pop
(sin conflictos) eliminará el alijo después de que se aplique. Pero si lo git stash apply
hace, aplicará el parche sin eliminarlo de la lista de alijo. Luego puede revertir los cambios no deseados congit checkout -- files...
git stash pop
y HAY conflictos, deberá solucionarlos manualmente y NO se eliminará el alijo.
Una forma más:
git diff stash@{N}^! -- path/to/file1 path/to/file2 | git apply -R
checkout
o show
sobrescribirá ciegamente su archivo en lugar de simplemente aplicar cambios. "Una forma más" es quedarse corto.
path/to/file2
el que desea diferenciar en el mismo archivo en su espacio de trabajo. Dejar el segundo camino funciona bien para mí. - Y recibo un mensaje de error usando la -R
opción ("¿aplicar el parche en reversa", tratando de parchear la versión oculta ?!). Así se ve mi versión de trabajo git diff stash@{N}^! -- path/to/file | git apply -
.
...| git apply -3 -
Para usuarios de Windows: las llaves tienen un significado especial en PowerShell. Puede rodear con comillas simples o escapar con una tecla de retroceso. Por ejemplo:
git checkout 'stash@{0}' YourFile
Sin él, puede recibir un error:
Unknown switch 'e'