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.
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?
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.