Diferencia entre reset –soft y –mixed

Soy nuevo en GIT e bash entender la diferencia entre git reset --soft y git reset --mixed . Sé que este último restablece el índice, mientras que el primero no, pero estoy tratando de entender cuál es la diferencia material: ¿cuándo usaría el uno contra el otro?

He leído esta publicación de Stack Overflow , que parece sugerir que mixed presta a realizar algunos cambios antes de volver a comprometerse, mientras que el soft presta para simplemente volver a comprometerse de inmediato. Estoy usando SourceTree, con el panel de transición desactivado, y luchando por ver por qué es así; No puedo ver diferencias reales reales por mi vida.

La única diferencia que puedo ver es que un file recién agregado que reinicié aparece como agregado con un restablecimiento parcial, pero no así con mixto. Pero en cualquier caso puedo hacer cambios con éxito en el file recién agregado y volver a comprometerme. Y, por supuesto, cualquier cambio que realice en los files existentes se agrega sin problemas a mis cambios actuales no comprometidos, listos para comprometerse.

¿Tengo que usar el Panel de etapas con el Árbol de fonts para ver alguna diferencia práctica, o me estoy perdiendo algo? Para ser claro, con la forma en que tengo configurada la herramienta ahora, veo cambios no comprometidos, que comprometo en un solo paso.

Si está utilizando un .gitignore que no está registrado en el repository o cambiado entre los commits, no podrá agregar files ignorados de un restablecimiento mixto, excepto que de forma manual, ni git diff ni git status mostrarán que son ahí.

Con un reinicio suave, se garantizará que todo lo que haya reiniciado se incluya en la confirmación en caso de que lo haga.

En realidad, cualquiera de esos podría ser la forma que necesita, es por eso que ambos methods (y el acceso explícito al índice en sí) están ahí en GIT.

Primero, lea el enlace sugerido por @Ant P arriba.

¿Cuál es la diferencia entre git reset –mixed, –soft, y –hard?

Permítanme complementar eso con un poco de model de lo que está pasando.

'git reset' funciona con tres cosas diferentes.

  1. La reference HEAD. Esto indica el punto de reference. Esto tiene varios usos, pero quizás lo más relevante para usted aquí es que este será el padre de su próximo compromiso (suponiendo que no lo cambie de nuevo).
  2. Tu tree de trabajo.
  3. El índice. (El panel "Etapa" en SourceTree). Esto es lo que usa Git para build el próximo commit. En realidad, no está creando commits desde tu tree de trabajo directamente. Es por eso que necesitas hacer 'git add'.

Entonces, si crea un repository git con dos files, foo.txt y bar.txt.

En su primera revisión, ponga 'v1' en cada file. En su segunda revisión, ponga 'v2' en cada file. Ahora, ponga 'v3' en cada uno, y 'git add foo.txt'.

En este punto, cambia de opinión y decide volver a la primera revisión. ¿En qué estado quieres terminar?

  • 'git reset –hard HEAD ^': reinicia todo. Su tree vuelve a la primera revisión, sin cambios en queue para el índice.
  • 'git reset –soft HEAD ^': simplemente reinicia el puntero HEAD. El índice todavía tiene el estado antes del reinicio. Esto significa que todos los cambios en el segundo commit, MÁS todo lo que ya ha agregado. Por lo tanto, tiene el 'v3' que ingresó en foo.txt y el 'v2' que confirmó en su primer bash en el segundo commit.
  • 'git reset –mixed HEAD ^': Esto simplemente restablece el índice, llenándolo con la revisión actual. En efecto, está deshaciendo cualquier 'git add' que haya hecho (o 'git rm').

Entonces, ¿por qué querrías hacer un reinicio de git –soft?

Supongamos que crea un compromiso y decide que no lo hizo bien, y desea solucionarlo antes de presionar. (IMPORTANTE: una vez que presionas, quieres considerar las confirmaciones como permanentes, o harás las cosas difíciles para todos los demás)

Podrías hacer tus cambios, y hacer 'git commit –amend'. Pero eso solo funciona para el último compromiso. O bien, podría hacer 'git rebase –interactive', y hacer su cambio a una confirmación específica, fusionar compromisos, etc.

O puede hacer 'git reset –soft', agregar, cambiar, cambiar o reiniciar cualquier file, hasta que obtenga el estado que desea para su nueva confirmación, y luego confirmarlo como su nueva confirmación.

'git reset –mixed' (o sin el –mezclado; es el pnetworkingeterminado) es útil para deshacer 'git add' o 'git rm'.

En pocas palabras, en mi opinión probablemente no quieras usar –soft en el uso interactivo. No tiene nada de malo utilizarlo, pero 'git commit –amend' o 'git rebase –interactive' puede ser una forma más intuitiva de get lo que quiere.

'git reset –mixed' usará mucho.