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 --soft
ne 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 --soft
ne 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 reset
changer 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 master
vé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 reset
commande.
Modifiez également votre index
git reset --mixed <ref>
ou équivalent
git reset <ref>
:
Fait ce que --soft
fait ET réinitialise également l'index pour qu'il corresponde à la validation à la référence spécifiée. Tandis que git reset --soft HEAD
ne fait rien (car il dit déplacer la branche extraite vers la branche extraite), git reset --mixed HEAD
ou 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 --mixed
fait 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 reset
dé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. HEAD
c'est vous , et ainsi vous bougerez quand vous le ferez.