Git stash uncached: ¿cómo guardar todos los cambios no organizados?

96

Supongamos que se realizan dos conjuntos de cambios en un proyecto versionado por git. Un set está organizado y el otro no.

Me gustaría volver a verificar los cambios por etapas ejecutando mi proyecto en este estado (antes de confirmar). ¿Cuál es una forma sencilla de guardar todos los cambios sin etapas y dejarlos solo por etapas? Así que necesito que los cambios sin etapas desaparezcan de mi proyecto, pero que se almacenen en algún lugar para seguir trabajando.

Esto suena muy parecido a un git stashcomando. Pero git stashalejaría de mi proyecto tanto los cambios no escenificados como los escenificados. Y no puedo encontrar algo como git stash uncached.

klm123
fuente
A partir de hoy con mi git 2.21, todavía no hay una buena respuesta a esto. Todas las respuestas a continuación son incorrectas ( -kopción) o incómodas de usar.
Penghe Geng

Respuestas:

100

Actualización 2:
no estoy seguro de por qué la gente se queja de esta respuesta, parece que funciona perfectamente conmigo, para los archivos no extraídos, puede agregar la -ubandera

El comando completo se convierte en git stash --keep-index -u

Y aquí hay un fragmento de la git-stashayuda.

Si se usa la opción --keep-index, todos los cambios ya agregados al índice se dejan intactos.

Si se usa la opción --include-untracked, todos los archivos sin seguimiento también se guardan y luego se limpian con git clean, dejando el directorio de trabajo en un estado muy limpio. Si se usa la opción --all, los archivos ignorados se guardan y se limpian además de los archivos sin seguimiento.

Y este es un gif de cómo se ve:

ingrese la descripción de la imagen aquí

Actualizar:

Aunque esta es la respuesta seleccionada, muchos han señalado que la [respuesta a continuación] (https://stackoverflow.com/a/34681302/292408) es la correcta, recomiendo revisarla.

Probé mi respuesta nuevamente hoy (31/1/2020) contra la versión de git 2.24.0, y todavía creo que es correcta, agregué una pequeña nota arriba sobre los archivos sin seguimiento. Si cree que no funciona, mencione también su versión de git.

Respuesta anterior :
si --keep-indexse usa la opción, todos los cambios ya agregados al índice se dejan intactos:

git stash --keep-index

De la documentación degit-stash :

Probando confirmaciones parciales

Puede utilizarlo git stash save --keep-indexcuando desee realizar dos o más confirmaciones a partir de los cambios en el árbol de trabajo y desee probar cada cambio antes de realizar la confirmación:

# ... hack hack hack ...
$ git add --patch foo            # add just first part to the index
$ git stash save --keep-index    # save all other changes to the stash
$ edit/build/test first part
$ git commit -m 'First part'     # commit fully tested change
$ git stash pop                  # prepare to work on all other changes
# ... repeat above five steps until one commit remains ...
$ edit/build/test remaining parts
$ git commit foo -m 'Remaining parts'

Pero, si solo desea verificar visualmente los cambios por etapas, puede probar difftool:

git difftool --cached
Mohammad AbuShady
fuente
4
vea también git stash [-p|--patch]cuál se siente como un escondite interactivo. Desde man git stash"Con --patch, puede seleccionar de forma interactiva trozos de la diferencia entre HEAD y el árbol de trabajo para guardarlos".
aquí
1
Normalmente add -p, checkout -py reset -pnunca lo intenté stash -p, gracias por el consejo: D
Mohammad AbuShady
19
Tenga en cuenta que esta respuesta también ocultará los cambios que ha realizado.
Ben Flynn
1
Esta respuesta no es realmente útil ya que dará lugar a confusión. Esta respuesta es mejor stackoverflow.com/a/34681302/292408 .
Elijah Lynn
1
@ElijahLynn He vinculado a la otra respuesta ya que encontré a mucha gente diciendo que es la mejor respuesta, gracias por tu comentario
Mohammad AbuShady
102

La respuesta aceptada también esconde cambios por etapas, como algunos han señalado. Esta es una manera de hacerlo sin tener que guardar los cambios por etapas.

La idea es hacer una confirmación temporal de sus cambios por etapas, luego esconder los cambios no preparados y luego anular la confirmación de la confirmación temporal:

# temp commit of your staged changes:
$ git commit --message "WIP"

# -u option so you also stash untracked files
$ git stash -u

# now un-commit your WIP commit:
$ git reset --soft HEAD^

En este punto, tendrá un alijo de sus cambios sin etapas y solo tendrá sus cambios en etapas presentes en su copia de trabajo.

stephen.hanson
fuente
22
Esta es realmente la respuesta correcta en mi opinión. La --keep-indexopción en la respuesta aceptada actual aún guarda lo que está en el índice, simplemente también lo mantiene en el índice. Entonces se duplica y se produce la risa.
Ken Williams
4
@KenWilliams <del> hilaridad </del> <ins> tragedia </ins>
tuespetre
@KenWilliams Eso realmente me irritó. OP ¿puede ajustar la respuesta seleccionada?
MikeMurko
2
Es git add .posible que desee mejorar el paso, git add --allya que también debería capturar los archivos en un directorio sobre el directorio de trabajo actual.
Elijah Lynn
1
Esta es la mejor respuesta hasta ahora, ya que la opción --keep-index en la respuesta aceptada es engañosa. Esta debería ser la respuesta aceptada.
Elijah Lynn
21

Descubrí que la respuesta marcada no funcionaba para mí, ya que necesitaba algo que realmente escondiera solo mis cambios no escenificados. La respuesta marcada git stash --keep-index,, esconde los cambios escenificados y no escenificados. La --keep-indexparte simplemente deja el índice intacto también en la copia de trabajo. Eso funciona para OP, pero solo porque hizo una pregunta ligeramente diferente a la que realmente quería la respuesta.

La única forma verdadera que he encontrado de esconder cambios sin etapas es no usar el alijo en absoluto:

git diff > unstaged.diff
git apply -R unstaged.diff

git checkout -- .también funcionará en lugar de apply -R.

Trabajo Trabajo trabajo...

git apply unstaged.diff
rm unstaged.diff
Archivo binario
fuente
1
Aquí en adelante git version 2.6.1.windows.1, git stash -kfuncionó como se describe.
koppor
¡Esta debería ser la respuesta aceptada! ¡Es el único en múltiples subprocesos de stackoverflow que hace lo que dice y no depende de hacer confirmaciones temporales!
user643011
1
@ user643011: Las confirmaciones temporales no son algo malo en git. No cuestan nada y no hacen daño a nadie.
Fritz
1
@Fritz: No es posible realizar confirmaciones temporales en algunos escenarios. Puede fallar si tiene un gancho de confirmación previa que verifica el código de trabajo actual. Si sus cambios por etapas son buenos pero sus cambios sin etapas no lo son, este enfoque fallará al confirmar los cambios por etapas.
Penghe Geng
1
Esto no incluye archivos sin seguimiento. Necesita usar "git ls-files" para encontrar e incluir aquellos en el parche diff
ACyclic
5

Git: Stash cambios sin etapas

Esto guardará todas las modificaciones que no agregaste:

git stash -k

Tenga en cuenta que los archivos recién creados (y no agregados) permanecerán en su directorio de trabajo a menos que también use el -uinterruptor.

git stash -k -u 

Además, su directorio de trabajo debe estar limpio (es decir, es necesario agregar todos los cambios) cuando git stash pop más adelante.

http://makandracards.com/makandra/853-git-stash-unstaged-changes

Cory Danielson
fuente
13
Esto es equivalente a git stash --keep-index. Los archivos por etapas se incluyen en el alijo.
Benjamin Cheah