stash que name hace git

que - ¿Por qué ''git stash apply'' modifica mis cambios?



git stash pop que hace (3)

¿Por qué git stash aplica mis cambios?

Cualquier cosa que afecte a su árbol de trabajo ( como un git checkout -- afile ) afectará primero su índice.

el índice es el intermediario para mover cosas de su árbol de trabajo al almacén de objetos Y para mover cosas del almacén de objetos a su árbol de trabajo.

El índice también es utilizado por git stash apply para registrar conflictos de combinación, ya que el índice tiene entradas de etapa n . Ver git merge :

Para rutas en conflicto, el archivo de índice registra hasta tres versiones:

  • la etapa 1 almacena la versión del ancestro común,
  • etapa 2 de HEAD, y
  • etapa 3 de MERGE_HEAD (puede inspeccionar las etapas con git ls-files -u ).

En la historia de la evolución de git stash --apply , se deben tener en cuenta dos eventos interesantes: en abril de 2011 (Git 1.7.5.1, commit e0e2a9c ), stash dejó caer el cheque sucio del worktree.

Antes de aplicar un alijo, nos aseguramos de que no haya cambios en el área de trabajo que no estén en el índice. Esta verificación se remonta al git-stash.sh original, y se supone que tiene la intención de evitar que los cambios en el árbol de trabajo se pierdan accidentalmente durante la fusión.

Sin embargo, esta comprobación tiene dos problemas:

  1. Es demasiado restrictivo. Si mi alijo solo cambia el archivo " foo ", pero la " bar " está sucia en el árbol de trabajo, evitará que apliquemos el alijo.

  2. Es redundante. No tocamos el árbol de trabajo hasta que llamamos merge-recursive.
    Pero tiene sus propios controles (mucho más precisos) para evitar la pérdida de datos del árbol de trabajo, y abortará la fusión con un mensaje más agradable que nos diga qué rutas fueron problemas.

Así que simplemente podemos dejar el cheque por completo.

El uso del índice para administrar la fusión realizada por un git stash apply a otro error, detectado en abril de 2015, Git 2.4.2, confirma ed178ef :

stash : requiere un índice limpio para aplicar

Si ha stash apply contenidos en su índice y ejecuta " stash apply ", podemos llegar a un conflicto y poner nuevas entradas en el índice.
Recuperarse a su estado original es difícil en ese momento, porque las herramientas como " git reset --keep " eliminarán cualquier cosa en escena .
Podemos hacer esto más seguro rechazando la aplicación cuando hay cambios por etapas.

Hago un cambio y luego git stash y luego git stash apply

Mi pregunta es

  1. ¿Por qué después de que git stash apply , mi cambio se convierte en "puesta en escena"? es decir, no veré nada si hago git diff , solo veo mi diferencia si hago git diff --cached ?

  2. ¿Hay alguna forma de "desestabilizar" mis cambios organizados por el comando git stash apply ?

  3. ¿Hay algún comando git básicamente que me permita ''hacer una copia de seguridad de mi cambio, restablecerlo en el HEAD y copiar mi copia de seguridad''? Pensé que git stash y luego git stash apply ese comando, pero de alguna manera ¿cómo "monté" todos mis cambios? ¿Hay algún equivalente que me permita git stash apply sin la parte de los cambios en escena?


Creo que algo puede estar mal en su configuración, ya que mientras git stash registra el estado del índice y el árbol de trabajo antes de restablecer la última confirmación, git stash apply solo debe intentar restaurar el estado del índice si usa el --index opción de --index .

Un posible punto de confusión es que si tiene un conflicto (es decir, se han introducido conflictos de combinación porque el alijo se está aplicando a un compromiso diferente donde los archivos afectados por el alijo se han cambiado desde el compromiso en el que se realizó el alijo), entonces Si usa mergetool para resolver los conflictos, mergetool automáticamente cambios a los archivos en una resolución exitosa.

Como Greg Hewgill declara, un reinicio simple anulará todos los cambios en etapas.

git reset


Si encuentra que sus cambios se preparan inesperadamente, haga:

git reset HEAD

Por lo general, solo veo esto si hay un conflicto al aplicar los cambios ocultos. Querrá verificar si este es el caso antes de hacer el git reset .

El comando git stash es el comando más apropiado para su caso de uso. Lo uso todo el tiempo exactamente para este propósito.