origin - git revert file
¿Cuál es la diferencia entre "git reset" y "git checkout"? (6)
Siempre he pensado que git reset
y git checkout
son iguales, en el sentido de que ambos devuelven el proyecto a un compromiso específico. Sin embargo, siento que no pueden ser exactamente iguales, ya que eso sería redundante. ¿Cuál es la diferencia real entre los dos? Estoy un poco confundido, ya que la svn solo tiene svn co
para revertir la confirmación.
ADICIONAL
El siguiente diagrama explica la diferencia, aunque de una manera posiblemente simplificada o incorrecta. ¿Qué piensas? ¿Está mal o demasiado simplificado?
AÑADIDO 2
VonC y Charles explicaron muy bien las diferencias entre el git reset
git checkout
y la git checkout
. Mi entendimiento actual es que el git reset
revierte todos los cambios a un compromiso específico, mientras que git checkout
prepara más o menos para una rama. Encontré los siguientes dos diagramas muy útiles para llegar a este entendimiento:
AÑADIDO 3
Desde http://think-like-a-git.net/sections/rebase-from-the-ground-up/using-git-cherry-pick-to-simulate-git-rebase.html , la verificación y el reinicio pueden emular la rebase
git checkout bar
git reset --hard newbar
git branch -d newbar
En su forma más simple, reset
restablece el índice sin tocar el árbol de trabajo, mientras que la checkout
cambia el árbol de trabajo sin tocar el índice.
Restablece el índice para que coincida con HEAD
, trabajando solo en el árbol:
git reset
Conceptualmente, esto comprueba el índice en el árbol de trabajo. Para hacer que realmente haga algo, 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 argumentos" no sea destructiva:
git checkout
Una vez que comienzas a agregar parámetros, es cierto que hay cierta superposición.
checkout
se suele utilizar con una rama, etiqueta o confirmación. En este caso, se restablecerán 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 proporciona --hard
para reset
, puede pedir reset
para sobrescribir el árbol de trabajo, así como reiniciar el índice.
Si actualmente tiene una sucursal desprotegida, existe una diferencia crucial entre reset
y checkout
cuando proporciona una sucursal o confirmación alternativa. reset
cambiará la rama actual para que apunte a la confirmación seleccionada, mientras que el proceso de checkout
dejará la rama actual solo, pero en cambio la verificación proporcionará la rama suministrada.
Otras formas de reset
y commit
implican el suministro de rutas.
Si proporciona rutas para reset
no puede suministrar --hard
y reset
solo cambiará la versión de índice de las rutas proporcionadas a la versión en el commit suministrado (o HEAD
si no especifica un commit).
Si proporciona rutas para el proceso de checkout
, al igual que reset
, se actualizará la versión de índice de las rutas suministradas para que coincidan con el compromiso suministrado (o HEAD
), pero siempre se registrará la versión de índice de las rutas suministradas en el árbol de trabajo.
La diferencia clave en pocas palabras es que el reset
mueve la referencia de rama actual , mientras que la checkout
no lo hace (mueve HEAD).
Como el libro Pro Git explica en Restablecer Desmitificado ,
Lo primero que hará el
reset
es mover los puntos HEAD a . Esto no es lo mismo que cambiar HEAD en sí (que es lo que hace elcheckout
);reset
mueve la rama a la que HEAD está apuntando. Esto significa que si HEAD se establece en la ramamaster
(es decir, actualmente está en la ramamaster
), la ejecución degit reset 9e5e6a4
comenzará haciendo que el puntomaster
9e5e6a4
. [énfasis añadido]
Vea también la respuesta de VonC para un texto muy útil y un extracto del diagrama del mismo artículo, que no voy a duplicar aquí.
Por supuesto, hay muchos más detalles sobre los efectos que pueden tener la checkout
y el reset
efectos 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.
Los dos comandos (reset y checkout) son completamente diferentes.
checkout X
NO ES reset --hard X
Si X es el nombre de una rama, el checkout X
cambiará la rama actual mientras que el reset --hard X
no lo hará.
Un caso de uso simple al revertir el cambio:
1. Use restablecer si desea deshacer la puesta en escena de un archivo modificado.
2. Use checkout si desea descartar los cambios a los archivos sin organizar.
Atlassian nos da una excelente explicación sobre el restablecimiento de git , la comprobación de git y, por lo tanto, git revertir . En este artículo, se explican los diferentes usos de estos comandos en diferentes niveles: archivo, instantánea por etapas y confirmación.
https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting
-
git reset
es específicamente para actualizar el índice , mover la CABEZA. -
git checkout
se trata de actualizar el árbol de trabajo (al índice o al árbol especificado). Actualizará la CABEZA solo si selecciona una sucursal (de lo contrario, terminará con una CABEZA separada ).
En comparación, como 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
sería:
-
svn update
(si está en la misma rama, es decir, la misma URL de SVN) -
svn switch
(si realiza el pago, por ejemplo, la misma rama, pero desde otra URL de repositorio SVN)
Las tres modificaciones del árbol de trabajo ( svn checkout
, update
, switch
) solo tienen un comando en git: git checkout
.
Pero dado que git también tiene la noción de índice (esa "área de preparación" entre el repositorio y el árbol de trabajo), también tiene git reset
.
Thinkeye menciona en los comentarios el artículo " Reset Demystified ".
Por ejemplo, si tenemos dos ramas, ''
master
'' y ''develop
'' apuntando a diferentes confirmaciones, y actualmente estamos en ''develop
'' (por lo que HEAD lo señala) y ejecutamosgit reset master
, ''develop
'' por sí mismo ahora apunta a la misma confirmación que hace ''master
''.Por otro lado, si en cambio ejecutamos el
git checkout master
, el ''develop
'' no se moverá,HEAD
sí lo hará.HEAD
ahora apuntará a ''master
''.Entonces, en ambos casos estamos moviendo
HEAD
para que apunte a cometerA
, pero la forma en que lo hacemos es muy diferente.reset
moverá los puntosHEAD
la rama a, el pago y envío mueve la propiaHEAD
para apuntar a otra rama.