Se aplica la diferencia entre git stash pop y git stash

1024

Lo he estado usando git stash popdurante bastante tiempo. Recientemente me enteré del git stash applycomando. Cuando lo probé, parecía funcionar igual que git stash pop.

¿Cuál es la diferencia entre git stash popy git stash apply?

Sandeep Raju Prabhakar
fuente

Respuestas:

1629

git stash pop tira el alijo (más alto, por defecto) después de aplicarlo, mientras que lo git stash apply deja en la lista de alijo para su posible reutilización posterior (o puede git stash drophacerlo).

Esto sucede a menos que haya conflictos después git stash pop, en cuyo caso no eliminará el alijo, dejando que se comporte exactamente igual git stash apply.

Otra forma de verlo: git stash popes git stash apply && git stash drop.

John Zwinck
fuente
117
como las notas de respuesta de @ briankip a continuación, si hay conflictos cuando se abre un alijo, pop no eliminará el alijo (y se comportará exactamente como corresponde)
Kashif
Parece que incluso si los cambios no escalonados en su rama son los mismos que git stash popel resultado, aún obtendrá un error de conflicto.
DimP
79

Obtuve este enlace útil que establece la diferencia, como John Zwinck ha declarado y un inconveniente de git stash pop.

Por ejemplo, supongamos que sus cambios escondidos entran en conflicto con otros cambios que ha realizado desde que creó el escondite. Tanto pop como apply activarán útilmente el modo de resolución de conflictos de fusión, lo que le permitirá resolver dichos conflictos de forma agradable ... y ninguno de los dos eliminará el alijo, aunque quizás también esté esperando pop. Dado que muchas personas esperan que los escondites sean solo una pila simple, esto a menudo los lleva a reventar el mismo alijo accidentalmente más tarde porque pensaron que se había ido.

Enlace: http://codingkilledthecat.wordpress.com/2012/04/27/git-stash-pop-considered-harmful/

briankip
fuente
66
El hecho de que un alijo persista cuando un pop falla realmente no es un inconveniente, aunque pueda parecer así al principio.
Amalgovinus
65

git stash popaplica el elemento escondido superior y lo elimina de la pila. git stash applyhace lo mismo, pero lo deja en la pila de alijo.

jchapa
fuente
43

Verlo en acción podría ayudarlo a comprender mejor la diferencia.

Suponiendo que estamos trabajando en una masterrama y tenemos un archivo hello.txtque contiene la cadena "Hola".

Modifiquemos el archivo y agreguemos una cadena "mundial". Ahora desea pasar a una rama diferente para corregir un error menor que acaba de encontrar, por lo que necesita realizar stashsus cambios:

git stash

Se mudó a la otra rama, solucionó el error y ahora está listo para continuar trabajando en su masterrama, por lo que poplos cambios:

git stash pop

Ahora, si intentas revisar el contenido oculto, obtendrás:

$ git stash show -p
No stash found.

Sin embargo, si lo usa git stash apply, obtendrá el contenido oculto pero también lo mantendrá:

$ git stash show -p
diff --git a/hello.txt b/hello.txt
index e965047..802992c 100644
--- a/hello.txt
+++ b/hello.txt
@@ -1 +1 @@
-Hello
+Hello world

Por poplo tanto, es como el pop de la pila: en realidad elimina el elemento una vez que applyaparece , mientras que es más como un vistazo .

Maroun
fuente
5

En git alijo hay un área de almacenamiento donde se pueden mover los archivos modificados actuales.

stashEl área es útil cuando desea extraer algunos cambios del gitrepositorio y detectar algunos cambios en algunos archivos mutuos disponibles en el gitrepositorio.

git stash apply //apply the changes without removing stored files from stash area.

git stash pop  // apply the changes as well as remove stored files from stash area.

Nota: - git applysolo aplique los cambios desde el área oculta mientras git popaplica, así como elimine los cambios desde el stashárea.

Vikrant Kashyap
fuente
1

Git Stash Pop vs applyWorking

Si desea aplicar sus cambios escondidos principales al cambio actual no escalonado y eliminar ese alijo también, entonces debe hacerlo git stash pop.

# apply the top stashed changes and delete it from git stash area.
git stash pop  

Pero si desea aplicar sus cambios escondidos principales al cambio actual sin etapas sin eliminarlo, entonces debe hacerlo git stash apply.

Nota: Puede relacionar este caso con la Stackclase pop()y los peek()métodos, donde pop cambia la parte superior por decrementos (top = top-1) pero peek()solo puede obtener el elemento superior.

Vikrant Kashyap
fuente