web-dev-qa-db-fra.com

Quelle est la différence entre Git Revert, Checkout et Reset?

J'essaie d'apprendre comment restaurer ou restaurer des fichiers et des projets à un état antérieur et je ne comprends pas la différence entre git revert, checkout et reset. Pourquoi y a-t-il 3 commandes différentes pour apparemment le même but, et quand quelqu'un devrait-il choisir l'une sur l'autre?

234
haziz

Ces trois commandes ont des objectifs totalement différents. Ils ne sont même pas distants.

git revert

Cette commande crée un nouveau commit qui annule les modifications d'un commit précédent. Cette commande ajoute un nouvel historique au projet (elle ne modifie pas l'historique existant).

git checkout

Cette commande extrait le contenu du référentiel et le place dans votre arbre de travail. Il peut également avoir d'autres effets, en fonction de la manière dont la commande a été appelée. Par exemple, cela peut également changer la branche sur laquelle vous travaillez actuellement. Cette commande ne modifie pas l'historique.

git reset

Cette commande est un peu plus compliquée. En fait, il fait différentes choses en fonction de la manière dont il est invoqué. Il modifie l'index (appelé "zone de stockage intermédiaire"). Ou cela change ce qui engage une tête de branche actuellement. Cette commande peut modifier l'historique existant (en modifiant le commit référencé par une branche).

Utiliser ces commandes

Si une validation a été effectuée quelque part dans l'historique du projet et que vous décidez plus tard que cette validation est incorrecte et qu'elle n'aurait pas dû être effectuée, alors git revert est l'outil du travail. Cela annulera les modifications introduites par le mauvais commit, en enregistrant le "annuler" dans l'historique.

Si vous avez modifié un fichier dans votre arbre de travail, mais n'avez pas validé la modification, vous pouvez utiliser git checkout pour extraire une copie du fichier fraîchement sortie du référentiel.

Si vous avez fait un commit, mais que vous ne l'avez pas partagé avec quelqu'un d'autre et que vous décidez que vous ne le voulez pas, vous pouvez utiliser git reset pour réécrire l'historique de sorte qu'il ne semble pas que vous ayez commis ce commit. .

Ce ne sont là que quelques exemples de scénarios d’utilisation possibles. D'autres commandes peuvent être utiles dans certaines situations, et les trois commandes ci-dessus ont également d'autres utilisations.

411
Dan Moulding
  • git revert est utilisé pour annuler une validation précédente. Dans git, vous ne pouvez pas modifier ou effacer un commit précédent. (En fait, vous pouvez le faire, mais cela peut poser problème.) Ainsi, au lieu d’éditer le commit précédent, annulez en introduisant un nouveau commit qui annule le précédent.
  • git reset est utilisé pour annuler les modifications dans votre répertoire de travail qui n'ont pas encore été validées.
  • git checkout est utilisé pour copier un fichier d'un autre commit dans votre arbre de travail actuel. Il ne commet pas automatiquement le fichier.
28
Jonathan

Disons que vous avez eu des commits:

C
B
A

git revert B, créera un commit qui annule les modifications dans B.

git revert A, créera un commit qui annulera les modifications dans A, mais ne touchera pas les modifications dans B

Notez que si les modifications dans B dépendent des modifications dans A, le retour de A n'est pas possible.

git reset --soft A, changera l'historique de validation et le référentiel; Le répertoire de transfert et de travail sera toujours à l'état C.

git reset --mixed A, modifiera l'historique de validation, le référentiel et le transfert; le répertoire de travail sera toujours à l'état de C.

git reset --hard A, modifiera l'historique de validation, le référentiel, le stockage intermédiaire et le répertoire de travail; vous retournerez à l'état de A complètement.

23
Akavall
  • git checkout modifie votre arbre de travail,
  • git reset modifie la référence de la branche sur laquelle vous vous trouvez,
  • git revert ajoute une validation annulant les modifications.
20
dan_waterworth

Réinitialiser - Au niveau de la validation, la réinitialisation est un moyen de déplacer le sommet d'une branche vers un autre commit. Ceci peut être utilisé pour supprimer les commits de la branche actuelle.

Revert - La restauration annule un commit en créant un nouveau commit. C'est un moyen sûr d'annuler les modifications, car il n'a aucune chance de réécrire l'historique de validation. Comparez cela à la réinitialisation de git, qui modifie l'historique de validation existant. Pour cette raison, git revert doit être utilisé pour annuler les modifications sur une branche publique et sa réinitialisation doit être réservé à l'annulation des modifications sur une branche privée.

Vous pouvez jeter un coup d'oeil sur ce lien - Reset, Checkout and Revert

6

Si vous avez cassé l'arborescence mais n'avez pas validé le code, vous pouvez utiliser git reset et si vous souhaitez uniquement restaurer un fichier, vous pouvez utiliser git checkout.

Si vous avez cassé l’arbre et commis le code, vous pouvez utiliser git revert HEAD.

http://book.git-scm.com/4_undoing_in_git_-_reset,_checkout_and_revert.html

5
LostMohican