Siempre he pensado git reset, y git checkoutcomo 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 coque revertir el commit.
ADICIONAL
VonC y Charles explicaron las diferencias entre git resety git checkoutrealmente bien. Mi comprensión actual es que git resetrevierte todos los cambios a una confirmación específica, mientras que git checkoutmá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



-- filesvariantes; 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.netse requieren pasos adicionales (proporcionados en el artículo vinculado ) para evitar la pérdida de datos.Respuestas:
git resetse trata específicamente de actualizar el índice , mover el HEAD.git checkoutse 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 checkoutcopiará una revisión dada en un directorio separado.El equivalente más cercano para
git checkoutwould: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 resetse trata de modificar la "etiqueta" de la rama y, opcionalmente, actualizar el índice o el árbol de trabajo como efecto secundario.git checkoutse trata de actualizar el árbol de trabajo y cambiar la rama actualmente "seleccionada" (laHEAD).git resetes 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 a839e8factualiza HEAD para señalar el compromisoa839e8f.En su forma más simple,
resetrestablece el índice sin tocar el árbol de trabajo, mientras quecheckoutcambia 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
-fpara 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.
checkoutgeneralmente se usa con una rama, etiqueta o commit. En este caso, se restableceráHEADy 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
--hardaresetusted puede pedirresetpara sobrescribir el árbol de trabajo, así como restablecer el índice.Si actualmente tiene una sucursal desprotegida, existe una diferencia crucial entre
resetycheckoutcuando proporciona una sucursal o compromiso alternativo.resetcambiará la rama actual para que apunte a la confirmación seleccionada, mientrascheckoutque dejará sola la rama actual, pero en su lugar, pagará la rama o confirmación suministrada.Otras formas
resetecommitimplican rutas de suministro.Si proporciona rutas a
resetno puede suministrar--hardyresetsolo cambiará la versión de índice de las rutas proporcionadas a la versión en el compromiso proporcionado (oHEADsi no especifica un compromiso).Si proporciona rutas a
checkout, al igualresetque 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
resetmueve la referencia de rama actual , mientrascheckoutque 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
checkouty qué efectosresetpuede 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 XNO ESreset --hard XSi X es un nombre de rama,
checkout Xcambiará la rama actual mientrasreset --hard Xque no lo hará.fuente
Breves mnemónicos:
fuente