Siempre he pensado git reset
, y git checkout
como el mismo, en el sentido de que ambos traen la parte posterior proyecto a un determinado comprometerse. Sin embargo, siento que no pueden ser exactamente lo mismo, ya que eso sería redundante. ¿Cuál es la diferencia real entre los dos? Estoy un poco confundido, ya que el svn solo tiene svn co
que revertir el commit.
ADICIONAL
VonC y Charles explicaron las diferencias entre git reset
y git checkout
realmente bien. Mi comprensión actual es que git reset
revierte todos los cambios a una confirmación específica, mientras que git checkout
más o menos se prepara para una rama. Encontré los siguientes dos diagramas bastante útiles para llegar a este entendimiento:
AGREGADO 3
Desde http://think-like-a-git.net/sections/rebase-from-the-ground-up/using-git-cherry-pick-to-simulate-git-rebase.html , el pago y el reinicio pueden emular El rebase.
git checkout bar
git reset --hard newbar
git branch -d newbar
fuente
-- files
variantes; no estoy seguro). Ese diagrama hace que parezca que la diferencia principal es si afectan el índice o el WD. Vea mi respuesta al respecto. Los diagramas segundo y tercero son muy útiles para ver la diferencia real. Los diagramas cuarto y quinto son útiles para verificar si comprende lo que hacen estos comandos, pero realmente no lo ayudará a llegar allí.think-like-a-git.net
se requieren pasos adicionales (proporcionados en el artículo vinculado ) para evitar la pérdida de datos.Respuestas:
git reset
se trata específicamente de actualizar el índice , mover el HEAD.git checkout
se trata de actualizar el árbol de trabajo (al índice o al árbol especificado). Actualizará la CABEZA solo si realiza el pago de una rama (si no, termina con una CABEZA separada ).(en realidad, con Git 2.23 Q3 2019, esto será
git restore
, no necesariamentegit checkout
)En comparación, dado que svn no tiene índice, solo un árbol de trabajo
svn checkout
copiará una revisión dada en un directorio separado.El equivalente más cercano para
git checkout
would:svn update
(si está en la misma rama, es decir, la misma URL SVN)svn switch
(si paga, por ejemplo, la misma rama, pero desde otra URL de repositorio SVN)Todas esas tres modificaciones árbol de trabajo (
svn checkout
,update
,switch
) tienen sólo un comando en git:git checkout
.Pero dado que git también tiene la noción de índice (esa "área de ensayo" entre el repositorio y el árbol de trabajo), usted también tiene
git reset
.Thinkeye menciona en los comentarios el artículo " Restablecer desmitificado ".
En esos puntos, sin embargo:
LarsH agrega en los comentarios :
De Novo coincide en los comentarios :
fuente
git reset
se trata de modificar la "etiqueta" de la rama y, opcionalmente, actualizar el índice o el árbol de trabajo como efecto secundario.git checkout
se trata de actualizar el árbol de trabajo y cambiar la rama actualmente "seleccionada" (laHEAD
).git reset
es 100% sobre elHEAD
. Funciona incluso en un modo HEAD separado ( stackoverflow.com/a/3965714/6309 ), lo que significa que no hay rama (!). git checkout también funciona en un modo HEAD separado, o puede usarse para pagar un SHA1 en un modo HEAD separado: de nuevo, no hay rama involucrada en ese caso.git checkout a839e8f
actualiza HEAD para señalar el compromisoa839e8f
.En su forma más simple,
reset
restablece el índice sin tocar el árbol de trabajo, mientras quecheckout
cambia el árbol de trabajo sin tocar el índice.Restablece el índice para que coincida
HEAD
, el árbol de trabajo queda solo:Conceptualmente, esto verifica el índice en el árbol de trabajo. Para hacer que realmente haga cualquier cosa, tendría que usar
-f
para forzarlo a sobrescribir cualquier cambio local. Esta es una característica de seguridad para asegurarse de que la forma "sin argumento" no sea destructiva:Una vez que comience a agregar parámetros, es cierto que existe cierta superposición.
checkout
generalmente se usa con una rama, etiqueta o commit. En este caso, se restableceráHEAD
y el índice a la confirmación dada, así como realizar la comprobación del índice en el árbol de trabajo.Además, si se suministra
--hard
areset
usted puede pedirreset
para sobrescribir el árbol de trabajo, así como restablecer el índice.Si actualmente tiene una sucursal desprotegida, existe una diferencia crucial entre
reset
ycheckout
cuando proporciona una sucursal o compromiso alternativo.reset
cambiará la rama actual para que apunte a la confirmación seleccionada, mientrascheckout
que dejará sola la rama actual, pero en su lugar, pagará la rama o confirmación suministrada.Otras formas
reset
ecommit
implican rutas de suministro.Si proporciona rutas a
reset
no puede suministrar--hard
yreset
solo cambiará la versión de índice de las rutas proporcionadas a la versión en el compromiso proporcionado (oHEAD
si no especifica un compromiso).Si proporciona rutas a
checkout
, al igualreset
que actualizará la versión de índice de las rutas proporcionadas para que coincida con la confirmación proporcionada (oHEAD
) pero siempre revisará la versión de índice de las rutas proporcionadas en el árbol de trabajo.fuente
Un caso de uso simple al revertir el cambio:
1. Use reset si desea deshacer la puesta en escena de un archivo modificado.
2. Use la opción de pago si desea descartar los cambios en archivos sin clasificar.
fuente
La diferencia clave en pocas palabras es que
reset
mueve la referencia de rama actual , mientrascheckout
que no (mueve HEAD).Como explica el libro Pro Git en Reset Demystified ,
Vea también la respuesta de VonC para un texto muy útil y un extracto del diagrama del mismo artículo, que no duplicaré aquí.
Por supuesto, hay muchos más detalles sobre qué efectos
checkout
y qué efectosreset
puede tener en el índice y el árbol de trabajo, según los parámetros que se utilicen. Puede haber muchas similitudes y diferencias entre los dos comandos. Pero como lo veo, la diferencia más crucial es si mueven la punta de la rama actual.fuente
Los dos comandos (reinicio y pago) son completamente diferentes.
checkout X
NO ESreset --hard X
Si X es un nombre de rama,
checkout X
cambiará la rama actual mientrasreset --hard X
que no lo hará.fuente
Breves mnemónicos:
fuente