Il y a un certain nombre de réponses ici avec une idée fausse sur git reset --soft. Bien qu'il existe une condition spécifique dans laquelle git reset --softne changera que HEAD(à partir d'un état de tête détaché), généralement (et pour l'utilisation prévue), il déplace la référence de branche que vous avez actuellement extraite. Bien sûr, il ne peut pas le faire si vous n'avez pas extrait une branche (d'où la condition spécifique où git reset --softne changera queHEAD ).
J'ai trouvé que c'était la meilleure façon de penser git reset. Vous ne vous déplacez pas seulement HEAD( tout fait cela ), vous déplacez également la référence de branche , par exemple master. Ceci est similaire à ce qui se passe lorsque vous exécutez git commit(la branche actuelle se déplace avec HEAD), sauf qu'au lieu de créer (et de passer à) un nouveau commit, vous passez à un précédent commit .
C'est le point de resetchanger une branche en autre chose qu'un nouveau commit, pas de changer HEAD. Vous pouvez le voir dans l'exemple de documentation:
Annuler une validation, ce qui en fait une branche de sujet
$ git branch topic/wip (1)
$ git reset --hard HEAD~3 (2)
$ git checkout topic/wip (3)
- Vous avez fait quelques commits, mais réalisez qu'ils étaient prématurés pour être dans la branche "master". Vous voulez continuer à les polir dans une branche de sujet, alors créez une branche "sujet / essuyer" hors de la TÊTE actuelle.
- Rembobinez la branche principale pour vous débarrasser de ces trois commits.
- Passez à la branche "sujet / essuyer" et continuez à travailler.
Quel est l'intérêt de cette série de commandes? Vous voulez déplacer une branche , ici master, donc pendant que vous avez mastervérifié, vous exécutezgit reset .
La réponse la plus votée ici est généralement bonne, mais j'ai pensé l'ajouter pour corriger les nombreuses réponses avec des idées fausses.
Changez de succursale
git reset --soft <ref>: Remet à zéro le pointeur de branchement pour la branche a vérifié la validation , à la référence spécifiée, <ref>. Les fichiers de votre répertoire de travail et de votre index ne sont pas modifiés. S'engager à partir de cette étape vous ramènera directement à l'endroit où vous étiez avant la git resetcommande.
Modifiez également votre index
git reset --mixed <ref>
ou équivalent
git reset <ref>:
Fait ce que --softfait ET réinitialise également l'index pour qu'il corresponde à la validation à la référence spécifiée. Tandis que git reset --soft HEADne fait rien (car il dit déplacer la branche extraite vers la branche extraite), git reset --mixed HEADou de manière équivalente git reset HEAD, est une commande courante et utile car elle réinitialise l'index à l'état de votre dernier commit.
Modifiez également votre répertoire de travail
git reset --hard <ref>: fait ce que --mixedfait ET écrase également votre répertoire de travail. Cette commande est similaire à git checkout <ref>, sauf que (et c'est le point crucial à propos de reset) toutes les formes de git resetdéplacement de la branche refHEAD pointées par la .
Une note sur "telle ou telle commande déplace la TÊTE":
Il n'est pas utile de dire qu'une commande déplace le HEAD. Toute commande qui change où vous vous trouvez dans votre historique de commit déplace le HEAD. Voilà ce que l' HEAD est , un pointeur à l' endroit où vous êtes. HEADc'est vous , et ainsi vous bougerez quand vous le ferez.