Synopsis
git reset [--soft | --mixed | --hard] [<commit>]
git reset [<commit>] [--] <pathspec>...
Description
The git reset command moves the current branch pointer to a specified commit, optionally updating the index and working tree. It has three primary modes: --soft (move HEAD only), --mixed (default; also reset the index), and --hard (also reset the working tree, discarding all changes).
Reset is one of the most powerful and most dangerous Git commands. git reset --hard can permanently lose work — though git reflog usually allows recovery within the reflog window. With path arguments, reset operates only on the index for those paths and never moves HEAD.
Dans l'usage quotidien, git reset s'intègre étroitement avec les alias de shell, les plugins d'éditeur et l'intégration continue. Les utilisateurs avancés ajoutent souvent des alias combinant les flags qu'ils passent toujours, ou enveloppent la commande dans des scripts qui appliquent les conventions d'équipe. Le formatage de la sortie peut être personnalisé via la configuration Git — pretty formats, schémas de couleurs et comportement du pager sont tous ajustables. Quand quelque chose tourne mal, la première étape de diagnostic est généralement de relancer la commande avec GIT_TRACE=1 dans l'environnement, ce qui révèle les appels de plomberie sous-jacents. Pour les situations inhabituelles, la sortie --help (git reset --help) ouvre la page de manuel complète avec les détails de chaque option, y compris celles rarement utilisées dans les workflows ordinaires mais essentielles pour le débogage ou le scripting à grande échelle.
Comprendre comment git reset interagit avec le reste du modèle de données de Git — la base d'objets, l'index, les refs et l'arborescence de travail — est rentable. Chaque commande opère sur un sous-ensemble de ces pièces, et savoir laquelle elle touche aide à prédire les résultats et récupérer après les erreurs. Lire la documentation officielle de Git en parallèle de la pratique sur un dépôt jetable est la façon la plus rapide d'intérioriser les subtilités. La plupart des problèmes de production avec Git proviennent de l'une de trois causes : comportement par défaut surprenant, opérations réseau partielles, ou réécriture d'historique déjà partagé. Un modèle mental fonctionnel des effets de bord de git reset aide à éviter les trois.
Options courantes
| Option | Description |
|---|---|
--soft | Déplacer HEAD seulement ; index et arborescence inchangés. |
--mixed (default) | Déplacer HEAD et réinitialiser l'index ; arborescence inchangée. |
--hard | Déplacer HEAD, réinitialiser l'index et écraser l'arborescence. |
--keep | Like --hard, mais abandonner si les changements locaux seraient perdus. |
--merge | Réinitialiser l'index et met à jour les fichiers qui diffèrent entre HEAD et la cible, en gardant les merges locaux. |
-p | Sélectionner interactivement les hunks à désindexer. |
Exemples
git reset HEAD~1
# Reculer d'un commit ; garder les changements en arborescence
git reset --soft HEAD~3
# Combiner les 3 derniers commits en un seul changement stagé
git reset --hard origin/main
# Abandonner TOUS les commits et changements locaux (dangereux)
git reset HEAD config.yml
# Désindexer un seul fichier (syntaxe ancienne pour git restore --staged)
Erreurs fréquentes
git reset --hard on a branch with unpushed commits loses them. Reflog can save you within ~90 days, but only if you know to look. Confusing git reset HEAD file (unstage) with git reset --hard (nuke) is a classic beginner footgun. Modern Git provides git restore --staged as a clearer alternative.
Commandes liées
git restore, git revert, git reflog, git stash