Estos tres comandos tienen propósitos completamente diferentes. Ni siquiera son remotamente similares.
git revert
Este comando crea una nueva confirmación que deshace los cambios de una confirmación anterior. Este comando agrega un nuevo historial al proyecto (no modifica el historial existente).
git checkout
Este comando extrae el contenido del repositorio y lo coloca en su árbol de trabajo. También puede tener otros efectos, dependiendo de cómo se invocó el comando. Por ejemplo, también puede cambiar en qué rama está trabajando actualmente. Este comando no realiza ningún cambio en el historial.
git reset
Este comando es un poco más complicado. Realmente hace un par de cosas diferentes dependiendo de cómo se invoque. Modifica el índice (el llamado "área de ensayo"). O cambia a qué compromiso apunta una cabeza de rama actualmente. Este comando puede alterar el historial existente (cambiando el compromiso al que hace referencia una rama).
Usando estos comandos
Si se ha realizado una confirmación en algún lugar de la historia del proyecto, y luego decide que la confirmación es incorrecta y no debería haberse realizado, entonces esa git revert
es la herramienta para el trabajo. Deshacerá los cambios introducidos por la mala confirmación, registrando el "deshacer" en la historia.
Si ha modificado un archivo en su árbol de trabajo, pero no ha confirmado el cambio, puede utilizar git checkout
para retirar una copia del archivo recién salido del repositorio.
Si ha realizado un compromiso, pero no lo ha compartido con nadie más y decide que no lo quiere, puede usarlo git reset
para reescribir el historial para que parezca que nunca lo hizo.
Estos son solo algunos de los posibles escenarios de uso. Hay otros comandos que pueden ser útiles en algunas situaciones, y los tres comandos anteriores también tienen otros usos.
git reset
ygit checkout
puede hacer exactamente lo mismo. Decir que "ni siquiera son remotamente similares" no es solo una exageración excesiva: ni siquiera es remotamente cierto. Estos dos comandos pueden hacer muchas cosas diferentes, algunas de las cuales se superponen por completo. Ejemplo:git reset --hard
ygit checkout -- .
haremos exactamente lo mismo. Y lógicamente hablando,git reset --hard <path>
ygit checkout <path>
también debería hacer exactamente lo mismo: git, sin embargo, te impide hacerlo. Confundir estos dos comandos es MUY fácil.git reset --hard <path>
que puedegit checkout <path>
precisamente porque los dos comandos hacen algo completamente diferente.git reset
le dice a Git que mueva HEAD a un commit diferente.git checkout
Por otro lado, no le pide a Git que haga nada con HEAD. Deja a HEAD solo y simplemente revisa un archivo. Sí, puedes crearlos de tal manera que tengan efectos similares. Pero lo que realmente hacen es totalmente diferente.Digamos que has cometido:
git revert B
, creará una confirmación que deshace los cambios enB
.git revert A
, creará una confirmación que deshace los cambiosA
, pero no toca los cambios enB
Tenga en cuenta que si los cambios en
B
dependen de los cambios enA
, la reversión deA
no es posible.git reset --soft A
, cambiará el historial de confirmación y el repositorio; El directorio provisional y de trabajo seguirá estando en estado deC
.git reset --mixed A
, cambiará el historial de confirmación, el repositorio y la preparación; el directorio de trabajo seguirá en estado deC
.git reset --hard A
, cambiará el historial de confirmaciones, el repositorio, la preparación y el directorio de trabajo; volverás al estado deA
completamente.fuente
git revert
se usa para deshacer una confirmación previa. En git, no puedes alterar o borrar una confirmación anterior. (En realidad puede, pero puede causar problemas). Entonces, en lugar de editar el commit anterior, revert introduce un nuevo commit que revierte uno anterior.git reset
se utiliza para deshacer cambios en su directorio de trabajo que aún no se han iniciado.git checkout
se usa para copiar un archivo de algún otro commit a su árbol de trabajo actual. No confirma automáticamente el archivo.fuente
git reset --soft
restablece el HEAD solamente,git reset --hard
restablece el HEAD y su directorio de trabajo.git checkout
modifica tu árbol de trabajo,git reset
modifica a qué referencia apunta la rama en la que estás,git revert
agrega una confirmación de deshacer cambios.fuente
git reset
no solo modifica la confirmación a la que apunta una rama , sino que también se utiliza para eliminar los archivos del índice y puede modificar la copia de trabajo congit reset --mixed
(el valor predeterminado).Restablecer: en el nivel de confirmación, restablecer es una forma de mover la punta de una rama a una confirmación diferente. Esto se puede usar para eliminar confirmaciones de la rama actual.
Revertir: revertir deshace una confirmación creando una nueva confirmación. Esta es una forma segura de deshacer cambios, ya que no tiene posibilidad de volver a escribir el historial de confirmación. Compare esto con git reset, que altera el historial de confirmación existente. Por esta razón, git revert debe usarse para deshacer cambios en una rama pública, y git reset debe reservarse para deshacer cambios en una rama privada.
Puede echar un vistazo en este enlace: restablecer, pagar y revertir
fuente
Si rompió el árbol pero no confirmó el código, puede usarlo
git reset
, y si solo desea restaurar un archivo, puede usarlogit checkout
.Si rompió el árbol y confirmó el código, puede usarlo
git revert HEAD
.http://book.git-scm.com/4_undoing_in_git_-_reset,_checkout_and_revert.html
fuente