Aller au contenu principal

Commande Git Reset


Table des matières


  1. Introduction à Git Reset
  2. Les trois modes de Reset
  3. Reset --soft
  4. Reset --mixed
  5. Reset --hard
  6. Reset un fichier spécifique
  7. Récupérer après un Reset
  8. Résumé comparatif


1 - Introduction à Git Reset



git reset est une commande puissante qui permet de :

  • Annuler des commits
  • Retirer des fichiers du staging
  • Revenir à un état précédent

Les trois zones Git

Pour comprendre reset, rappelons les trois zones :

┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
│ Working │ │ Staging │ │ Repository │
│ Directory │ │ Area │ │ (HEAD) │
│ │ │ │ │ │
│ Fichiers │ │ Index │ │ Commits │
│ modifiés │ │ prêt │ │ historique │
└─────────────────┘ └─────────────────┘ └─────────────────┘
▲ ▲ ▲
│ │ │
└──────────────────────┴───────────────────────┘
git reset agit sur ces zones

🔝 Retour à la table des matières



2 - Les trois modes de Reset



ModeWorking DirectoryStaging AreaHEAD
--soft✅ Préservé✅ Préservé🔄 Déplacé
--mixed (défaut)✅ Préservé🔄 Reset🔄 Déplacé
--hard🔄 Reset🔄 Reset🔄 Déplacé

Visualisation

                        --soft   --mixed  --hard
│ │ │
HEAD (Commits) │ │ │
▲ ▼ ▼ ▼
│ (déplacé)(déplacé)(déplacé)

Staging Area │ │ │
▲ │ ▼ ▼
│ (intact) (reset) (reset)

Working Directory │ │ │
▲ │ │ ▼
│ (intact) (intact) (reset)

🔝 Retour à la table des matières



3 - Reset --soft



Ce que ça fait

  • ✅ Déplace HEAD vers le commit spécifié
  • ✅ Garde le staging area intact
  • ✅ Garde le working directory intact

Cas d'usage

  • Annuler un commit tout en gardant les modifications prêtes à recommiter
  • Corriger un message de commit
  • Combiner plusieurs commits (alternative au squash)

Syntaxe

git reset --soft HEAD~1    # Annule le dernier commit
git reset --soft HEAD~3 # Annule les 3 derniers commits
git reset --soft abc1234 # Revient au commit abc1234

Exemple pratique

# Situation : vous venez de faire un commit avec un mauvais message
git log --oneline
# abc1234 mauvais message de commit
# def5678 commit précédent

# Annuler le commit (garder les fichiers staged)
git reset --soft HEAD~1

# Vérifier : les fichiers sont toujours staged
git status
# Changes to be committed:
# modified: file.txt

# Refaire le commit avec le bon message
git commit -m "feat: bon message de commit"

🔝 Retour à la table des matières



4 - Reset --mixed (défaut)



Ce que ça fait

  • ✅ Déplace HEAD vers le commit spécifié
  • 🔄 Reset le staging area
  • ✅ Garde le working directory intact

Cas d'usage

  • Retirer des fichiers du staging sans perdre les modifications
  • Annuler un commit et réorganiser les changements
  • Diviser un gros commit en plusieurs petits

Syntaxe

git reset HEAD~1           # --mixed est le défaut
git reset --mixed HEAD~1 # Explicite
git reset HEAD file.txt # Reset un fichier spécifique

Exemple pratique

# Situation : vous avez ajouté trop de fichiers au staging
git add .
git status
# Changes to be committed:
# modified: feature.js
# modified: debug.log # Oups, on ne veut pas ce fichier !

# Retirer tout du staging
git reset

# Ajouter seulement ce qu'on veut
git add feature.js
git commit -m "feat: add feature"

Diviser un commit

# Commit trop gros
git reset HEAD~1

# Maintenant les fichiers sont unstaged
# On peut les commiter séparément
git add file1.js
git commit -m "feat: first part"

git add file2.js
git commit -m "feat: second part"

🔝 Retour à la table des matières



5 - Reset --hard



Ce que ça fait

  • ✅ Déplace HEAD vers le commit spécifié
  • 🔄 Reset le staging area
  • 🔄 Reset le working directory

⚠️ DANGER : Les modifications non commitées sont PERDUES !

Cas d'usage

  • Abandonner complètement des modifications
  • Revenir à un état propre
  • Synchroniser avec le remote après un force push

Syntaxe

git reset --hard HEAD~1    # Annule complètement le dernier commit
git reset --hard HEAD # Annule toutes les modifications locales
git reset --hard origin/main # Synchronise avec le remote

Exemple pratique

# Situation : tout est cassé, on veut revenir à un état propre
git status
# Plein de modifications partout...

# ATTENTION : Ceci supprime TOUTES les modifications !
git reset --hard HEAD

# Ou revenir à l'état du remote
git reset --hard origin/main

Protection avant reset --hard

# Toujours vérifier le statut avant
git status

# Optionnel : sauvegarder dans un stash
git stash

# Puis faire le reset
git reset --hard HEAD~1

# Si besoin, récupérer le stash
git stash pop

🔝 Retour à la table des matières



6 - Reset un fichier spécifique



Retirer un fichier du staging

# Équivalent à "unstage"
git reset HEAD fichier.txt

# Ou la syntaxe moderne
git restore --staged fichier.txt

Annuler les modifications d'un fichier (working directory)

# Attention : perte des modifications !
git checkout -- fichier.txt

# Ou la syntaxe moderne
git restore fichier.txt

Reset un fichier à une version spécifique

# Reset un fichier à son état dans un commit spécifique
git checkout abc1234 -- fichier.txt

🔝 Retour à la table des matières



7 - Récupérer après un Reset



Le reflog à la rescousse

Git garde un historique de tous les mouvements de HEAD :

git reflog

Résultat :

abc1234 HEAD@{0}: reset: moving to HEAD~1
def5678 HEAD@{1}: commit: feat: important feature
ghi9012 HEAD@{2}: commit: previous commit

Récupérer un commit après reset

# Trouver le commit perdu
git reflog

# Revenir au commit
git reset --hard def5678

# Ou créer une branche pour le récupérer
git branch recovered-branch def5678

Durée de conservation

Git conserve le reflog pendant 90 jours par défaut. Après, les commits orphelins sont supprimés par le garbage collector.

🔝 Retour à la table des matières



8 - Résumé comparatif



Tableau récapitulatif

CommandeHEADStagingWorking DirUsage
reset --softIntactIntactModifier message/squash
reset --mixedResetIntactRéorganiser staging
reset --hardResetResetTout annuler

Aide-mémoire

--soft  = "Je veux annuler le commit mais garder mes changements prêts"
--mixed = "Je veux annuler le commit et réorganiser mes fichiers"
--hard = "Je veux tout effacer et repartir de zéro"

Commandes fréquentes

# Annuler le dernier commit (garder les modifications)
git reset --soft HEAD~1

# Retirer un fichier du staging
git reset HEAD fichier.txt

# Annuler toutes les modifications locales
git reset --hard HEAD

# Synchroniser avec le remote
git reset --hard origin/main

🔝 Retour à la table des matières