« git reset annule toujours les fichiers. »
Tous les modes déplacent d’abord la référence courante. Leur différence porte sur l’index et le working tree.
01Établis l’état initial
cd /tmp/soria-git-undo-$USER/reset-soft
git log --oneline -3
git status --porcelain
cat version.txt
Les trois dépôts commencent avec trois commits et version=3.
02Observe soft
git reset --soft HEAD~1
git log -1 --oneline
git diff --cached
git diff
HEAD revient au commit version 2. La version 3 reste dans l’index et le working tree.
03Observe mixed
cd ../reset-mixed
git reset --mixed HEAD~1
git diff --cached
git diff
HEAD revient à version 2, l’index s’aligne sur ce commit et version 3 reste uniquement dans le working tree.
04Observe hard
cd ../reset-hard
git status --porcelain
git reset --hard HEAD~1
cat version.txt
git status --porcelain
–hard aligne HEAD, index et working tree. La modification non commitée correspondant à version 3 disparaît du chemin courant.
05Compare dans une matrice
06Vérifie avant toute réécriture
git status --short
git log --oneline --decorate -5
git reflog -5
git branch safety-before-reset
Une branche de sécurité rend le point de départ explicite. Ne réécris pas un historique déjà partagé sans coordination.
Prédit puis vérifie
Avant chaque reset, écris l’état attendu de HEAD, index et working tree. Exécute ensuite dans les trois repositories du lab et compare avec les diffs réels.
✓Ce que tu retiens
Reset déplace une référence. Soft conserve index et fichiers, mixed conserve les fichiers seulement, hard réinitialise les trois états.