¿Cuál es exactamente la diferencia entre todos los modos de reinicio de Git?

Estoy intentando agregar resúmenes sucintos de los modos de reinicio de Git para la extensión sublime de Git-Savvy. ¡Es dificil!

Tengo esto:

mixed (default): update index soft: move branch pointer only hard: update index & working dir, discard local changes merge: update index & working dir, keep local changes keep: update index & working dir, abort if local changes 

(Esperemos que esté implícito que el puntero de la twig se mueve en todos los modos).

La documentation sobre los modos de reset es bastante turbia, y utiliza las frases "actualiza el índice", "toca el file de índice", "restablece el índice" y "restablece las inputs de índice" sin saber si son sinónimos o no. .

¿Hay otras diferencias sutiles entre --hard , --merge y --keep ?

En primer lugar, git reset restablece HEAD.
Y HEAD no siempre es un "puntero de twig": es el compromiso actual .

En segundo lugar, un git reset puede restablecerse en el nivel de confirmación o en el nivel de file (puede restablecer un file).

Pero en cualquier caso, usaría las dos palabras "mueve HEAD".

Encontrará una tabla más precisa en el git reset Desmitificado :

  head index work dir wd safe Commit Level reset --soft [commit] REF NO NO YES reset [commit] REF YES NO YES reset --hard [commit] REF YES YES NO checkout [commit] HEAD YES YES YES File Level reset (commit) [file] NO YES NO YES checkout (commit) [file]NO YES YES NO 

Ver también:

  • " git reset vs git reset HEAD " para entender por qué el restablecimiento de git está pnetworkingeterminado en HEAD (mientras que git checkout -- path no lo hace).
  • " ¿Cuál es la diferencia entre" git reset "y" git checkout "? "

De acuerdo, ya que no puedo encontrar un análisis completo de los diferentes modos, haré una tabla, usando un lenguaje que es más comprensible para el usuario. También estoy incluyendo el git checkout .

Para mayor claridad, el "Efecto en …"

  • "HEAD": a lo que HEAD apunta después de la operación
  • "Puntero de twig": si actualmente estamos en la punta de una twig B, a lo que B apunta después
  • "Índice vacío": lo que verá suceder al hacer un reinicio sin cambios por etapas.
  • "Archivos rastreados": si se cambiarán los files en el directory de trabajo si se cambia a una confirmación que los afecta
  • "Archivos sin seguimiento": se cambiarán los files sin seguimiento en el directory de trabajo. (Spoiler: No)

Limpiar el directory de trabajo:

 Effect on | soft | mixed | hard | merge | keep |checkout -----------------+---------------------------------------------|-------- HEAD | Move | Move | Move | Move | Move | Move Branch pointer | Move | Move | Move | Move | Move | - Empty index | Add* | - | - | - | - | - Tracked files | - | - | Change | Change | Change |Change Untracked files | - | - | - | - | - | - 

Cambios en el directory de trabajo (posiblemente en etapas) que no se ven afectados por la confirmación que estamos reiniciando / comprobando. (Por ejemplo, cambiamos el file .txt, pero no hay cambios en él entre el compromiso actual y hacia dónde vamos)

( - significa "mantener en estado actual", Both significa cambios escalonados y no escalonados en el mismo file)

 Staged changes | - | Unstage | Discard | Discard | Unstage| - Unstaged changes | - | - | Discard | - | - | - Both | - * | Unstage | Discard | Abort | Unstage| - 

Cambios en el directory de trabajo (posiblemente en etapas) que se ven afectados por la confirmación que estamos restableciendo / comprobando. Algunas veces se expresa como preguntando si la operación es "trabajo seguro en el directory".

  Effect on | soft | mixed | hard | merge | keep | checkout ----------------+-------------------------------------------|-------- Staged changes | - | Unstage | Discard | Discard | Abort| Abort Unstaged changes| - * | - | Discard | Abort | Abort| Abort Both | - * | Unstage | Discard | Abort | Abort| Abort 

* Nota sobre --soft

git reset --soft X convierte los cambios entre el directory de trabajo (incluido HEAD actual) y X en cambios por etapas. La página man de Git contra-intuitivamente describe esto como "no tocar el file de índice".

Cuando hay cambios por etapas, --soft combina con nuevos cambios por etapas.

Cuando hay cambios no --soft , --soft mantiene los cambios no --soft , pero también establece nuevos cambios como se --soft anteriormente. Es consistente pero potencialmente confuso.

Resumen

Los diferentes modos de git reset están definidos por estas preguntas:

  • se escenifican los cambios retenidos ( soft ), no escalonados ( mixed , keep ) o descartados ( merge , hard )
  • es el directory de trabajo actualizado siempre ( hard ), solo si es seguro ( keep , merge ) o nunca ( soft , mixed )
  • son cambios sin clasificar no relacionados retenidos ( soft , mixed , merge , keep ) o descartados ( hard )

Mis últimas descripciones sucintas de cada una:

  • mixto (pnetworkingeterminado): unstage en etapas, mantener sin escena, no tocar en funcionamiento (seguro)
  • suave: solo mueva CABEZA, diferencias de etapa (seguro)
  • Difícil: descartar en etapas, descartar sin clasificar, actualizar el trabajo (inseguro)
  • fusionar: descartar en etapas, mantener sin escena, actualizar el trabajo (abortar si no es seguro)
  • keep: unstage escenificado, keep unstaged, update working (abortar si no es seguro)