4 votes

Comparez l'utilisation de checkout ou de reset hard pour annuler un commit git.

Si j'utilise :

$ git reset --hard HEAD~N

o

$ git checkout HEAD~N

Les deux utiliseront la version de HEAD~N pour changer de répertoire de travail et de zone de stage.

S'il y a une différence entre ces deux commandes ?
Merci.

4voto

manojlds Points 96599

git checkout HEAD~N est destiné à examiner le commit et ne doit pas être travaillé car il créera un état de tête détachée. Si vous voulez réinitialiser (la tête de branche actuelle) à un commit particulier, vous utilisez git reset [--hard]

2voto

VonC Points 414372
  • git reset --hard réinitialisera le HEAD de la branche courante à la refspec spécifiée
  • git checkout changera de branche, et vous laissera dans une mode tête détachée .

Ainsi, avec la première, vous pouvez commencer à vous engager tout de suite, dans votre branche actuelle.
Avec la seconde, vous devez d'abord définir une branche, votre branche (précédemment) actuelle HEAD n'a pas bougé. Seul le répertoire de travail a été modifié. Et vous n'êtes plus dans aucune branche (d'où le "mode détaché").

2voto

Adam Dymitruk Points 34999

La première changera la branche pour pointer vers le commit que vous spécifiez. Les commits qui étaient avant celui-là seront perdus à moins qu'il n'y ait une autre référence à eux (branche ou tag). Il existe le reflog (git reflog) qui conserve un historique de ce qui a été extrait (par défaut, il conserve les 90 derniers jours).

La seconde changera la branche pour celle que vous avez spécifiée. Puisque vous avez spécifié un commit et non une branche locale, vous ne suivrez pas les changements que vous faites ici. À l'exception du reflog, vous perdrez ces commits qui ont été faits après le premier checkout quand vous ferez un checkout ultérieur autre que le commit actuel ou HEAD.

Une troisième façon de "défaire" le travail est de placer " -- ." après votre deuxième commande. Ceci changera votre arbre de travail en l'état dans lequel se trouvent les fichiers lors du commit que vous avez spécifié. Vous aurez toujours la même branche extraite et elle pointera toujours vers le même commit. Quand vous lancerez "git status", vous verrez que tous les changements dans votre répertoire de travail ressembleront à ce que vous avez édité pour que vos fichiers ressemblent à ce qu'ils étaient dans le commit que vous avez spécifié. Le fait de commiter ces changements fera un nouveau commit qui "défait" effectivement ce que les commits suivants en avant si celui spécifié a fait. Votre branche actuelle pointera maintenant vers ce commit. C'est une bonne pratique si d'autres personnes peuvent dépendre des commits que vous voulez effectivement effacer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X