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?
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).
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.
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.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.
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.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
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