soft origin hard example changes git git-checkout git-reset

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 el checkout ); reset mueve la rama a la que HEAD está apuntando. Esto significa que si HEAD se establece en la rama master (es decir, actualmente está en la rama master ), la ejecución de git reset 9e5e6a4 comenzará haciendo que el punto master 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.



  • 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 ejecutamos git 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 cometer A , pero la forma en que lo hacemos es muy diferente. reset moverá los puntos HEAD la rama a, el pago y envío mueve la propia HEAD para apuntar a otra rama.