the - ¿Cuál es la diferencia entre git reset--mixed,--soft y--hard?
git reset--soft head (10)
Estoy buscando dividir un compromiso y no estoy seguro de qué opción de reinicio usar.
Estaba mirando la página. ¿Puedes explicar qué hace "git reset" en inglés simple? , pero me di cuenta de que realmente no entiendo qué es el índice de git o el área de preparación y por lo tanto las explicaciones no ayudaron
También los casos de uso para --mixed
y --soft
parecen lo mismo en esa respuesta (cuando se quiere arreglar y volver a comprometerse). ¿Puede alguien descomponerlo aún más? Me doy cuenta de que --mixed
es probablemente la opción para ir, pero quiero saber por qué . Por último, ¿qué pasa con - --hard
?
¿Alguien puede darme un ejemplo de flujo de trabajo de cómo se seleccionarían las 3 opciones?
Antes de entrar en estas tres opciones, uno debe entender 3 cosas.
1) Historia / CABEZA
2) Etapa / índice
3) Directorio de trabajo
restablecer --soft: historial cambiado, HEAD cambiado, el directorio de trabajo no se modifica.
restablecer - mezclado: el historial cambió, HEAD cambió, el directorio de trabajo cambió con datos sin etapas.
reset - hard: Historial cambiado, HEAD cambiado, Directorio de trabajo cambiado con datos perdidos.
Siempre es seguro ir con Git --soft. Uno debe utilizar otra opción en el requisito complejo.
Cuando modifica un archivo en su repositorio, el cambio no está en fase inicial. Para cometerlo, debe configurarlo, es decir, agregarlo al índice, utilizando git add
. Cuando realiza una confirmación, los cambios confirmados son aquellos que se han agregado al índice.
git reset
cambia, como mínimo, a donde apunta la rama actual ( HEAD
). La diferencia entre --mixed
y --soft
es si su índice también se modifica. Por lo tanto, si estamos en rama master
con esta serie de confirmaciones:
- A - B - C (master)
HEAD
apunta a C
y el índice coincide con C
Cuando ejecutamos git reset --soft B
, master
(y por lo tanto HEAD
) ahora apunta a B
, pero el índice aún tiene los cambios de C
; git status
los mostrará como en escena. Entonces, si ejecutamos git commit
en este punto, obtendremos un nuevo commit con los mismos cambios que C
Bien, volviendo a empezar desde aquí:
- A - B - C (master)
Ahora vamos a hacer git reset --mixed B
(Nota: --mixed
es la opción por defecto). Una vez más, master
y HEAD
apuntan a B, pero esta vez el índice también se modifica para que coincida con B
Si ejecutamos git commit
en este punto, no ocurrirá nada, ya que el índice coincide con HEAD
. Todavía tenemos los cambios en el directorio de trabajo, pero como no están en el índice, el git status
muestra como sin etapas. Para cometerlos, git add
y luego cometer como de costumbre.
Y finalmente, --hard
es lo mismo que --mixed
(cambia tu HEAD
e índice), excepto que --hard
también modifica tu directorio de trabajo. Si estamos en C
y ejecutamos git reset --hard B
, los cambios agregados en C
, así como los cambios no confirmados que tenga, se eliminarán y los archivos en su copia de trabajo coincidirán con la confirmación B
Ya que puedes perder los cambios de esta manera de forma permanente, siempre debes ejecutar el git status
antes de hacer un restablecimiento completo para asegurarte de que tu directorio de trabajo esté limpio o de que estés de acuerdo con perder los cambios no confirmados.
Y por último, una visualización:
En los términos más simples:
-
--soft
: cambios no confirmados , los cambios quedan por etapas ( índice ). -
--mixed
(predeterminado) : descomprimir + modificar los cambios, se dejan los cambios en el árbol de trabajo . -
--hard
:--hard
+ unstage + delete changes, nada más.
La diferencia básica entre varias opciones del comando git reset es la siguiente.
- --soft: solo restablece la CABEZA a la confirmación que seleccionó. Funciona básicamente igual que git checkout pero no crea un estado principal separado.
- --mixed (opción predeterminada): restablece el HEAD a la confirmación que seleccionó en el historial y deshace los cambios en el índice.
- --hard: restablece el HEAD a la confirmación que seleccionó en el historial, deshace los cambios en el índice y deshace los cambios en su directorio de trabajo.
La respuesta de mkarasek es genial, en términos simples podemos decir ...
-
git reset --soft
: estableceHEAD
en el compromiso deseado pero mantiene los cambios en escena desde los últimos confirmados -
git reset --mixed
: es lo mismo quegit reset --soft
pero la única diferencia es que no segit reset --soft
los cambios de los últimos confirmaciones -
git reset --hard
: establece tuHEAD
en el compromiso que especifiques y restablece todos los cambios desde los últimos confirmados, incluidos los cambios no confirmados.
Una respuesta corta en qué contexto se usan las 3 opciones:
Para mantener los cambios actuales en el código, pero para volver a escribir el historial de confirmación:
-
soft
: puede confirmar todo a la vez y crear un nuevo compromiso con una nueva descripción (si usa torotise git o cualquier otra GUI, debe usar esta opción, ya que aún puede marcar qué archivos desea en el compromiso y marca). múltiples confirmaciones de esa manera con diferentes archivos. En Sourcetree todos los archivos se pondrían en escena para confirmar. -
mixed
: tendrá que agregar de nuevo los archivos individuales al índice antes de realizar confirmaciones (en Sourcetree todos los archivos modificados no estarán en fase)
Para perder realmente sus cambios en el código también:
-
hard
: no solo reescribe el historial, sino que también pierde todos sus cambios hasta el punto en que lo restableció
--soft
: Le dice a Git que restablezca HEAD a otra confirmación, por lo que el índice y el directorio de trabajo no se alterarán de ninguna manera. Todos los archivos cambiados entre el HEAD original y la confirmación se pondrán en escena.
--mixed
: Al igual que el software, esto restablecerá HEAD a otra confirmación. También restablecerá el índice para que coincida mientras no se toque el directorio de trabajo. Todos los cambios permanecerán en el directorio de trabajo y aparecerán como modificados, pero no por etapas.
--hard
: Esto restablece todo: restablece HEAD de nuevo a otra confirmación, restablece el índice para que coincida, y restablece el directorio de trabajo para que coincida con él también.
La principal diferencia entre --mixed
y --soft
es si su índice también se modifica. Compruebe más sobre esto here .
Tenga en cuenta que esta es una explicación simplificada que pretende ser un primer paso para comprender esta compleja funcionalidad.
Puede ser útil para los aprendices visuales que desean visualizar el estado de su proyecto después de cada uno de estos comandos:
Para aquellos que usan Terminal con el color activado (git config --global color.ui auto):
git reset --soft A
y verás las cosas de B y C en verde (preparadas y listas para comprometerse)
git reset --mixed A
(o git reset A
) y verás las cosas de B y C en rojo (sin etapas y listas para ser preparadas (verde) y luego confirmadas)
git reset --hard A
y ya no verás los cambios de B y C en ningún lugar (será como si nunca hubieran existido)
O para aquellos que usan un programa GUI como ''Tower'' o ''SourceTree''
git reset --soft A
y verás las cosas de B y C en el área de ''archivos organizados'' listos para cometer
git reset --mixed A
(o git reset A
) y verás las cosas de B y C en el área de ''archivos sin etapas'' listas para ser movidas a las etapas y luego confirmadas
git reset --hard A
y ya no verás los cambios de B y C en ningún lugar (será como si nunca hubieran existido)
Aquí hay una explicación básica para los usuarios de TortoiseGit:
git reset --soft
y --mixed
dejan sus archivos intactos.
git reset --hard
realidad, cambia tus archivos para que coincidan con la confirmación que restableciste.
En TortoiseGit, el concepto del índice está muy oculto por la GUI. Cuando modifica un archivo, no tiene que ejecutar git add
para agregar el cambio al área de almacenamiento / índice. Cuando se trata simplemente de modificar los archivos existentes que no cambian los nombres de los archivos, git reset --soft
y --mixed
son los mismos. Solo notará una diferencia si agrega archivos nuevos o archivos renombrados. En este caso, si ejecuta git reset --mixed, tendrá que volver a agregar su (s) archivo (s) de la lista de archivos no versionados .