Un parcours du tutoriel Commit sur la mauvaise branche : comment déplacer un commit hors de main vers une branche de feature avec git branch et git reset, sans perdre le travail.
Ce scénario est le moment classique « zut, c'est parti sur main ». Vous avez commité une fonctionnalité directement sur main alors qu'elle devait aller sur sa propre branche. La correction garde le commit intact tout en ramenant main là où il doit être.
La situation
Ce commit s'est retrouvé sur la mauvaise branche. L'objectif est de le déplacer vers la bonne.
main a deux commits : l'Initial commit, et Add skills section, qui a ajouté une section compétences à index.html. Ce second commit était destiné à une branche de feature, pas directement à main.
Rien n'est cassé, mais main porte maintenant du travail de feature inachevé. L'objectif est de retirer ce dernier commit de main et de le poser sur une branche de feature, pour que main revienne à un état propre.
Commencez par git log --oneline. Voir Add skills section comme dernier commit sur main confirme exactement ce que vous devez déplacer.
La correction, étape par étape
git branch feature capture le commit sur une nouvelle branche.
Confirmer ce qui est sur main
git log
Le log montre Add skills section au sommet de main. C'est le commit à relocaliser.
Sauvegarder le commit sur une nouvelle branche
git branch feature/skills
Cela crée un pointeur de branche sur le commit courant. Le travail Add skills section est désormais enregistré en sécurité sur feature/skills, même si vous êtes encore sur main.
Reculer main d'un commit
git reset --hard HEAD~1
Cela rembobine main avant le commit des compétences. Comme le commit est déjà sauvegardé sur feature/skills, rien n'est perdu : seul le pointeur de main bouge.
Basculer sur la branche de feature pour continuer
git checkout feature/skills
Maintenant main est propre et le travail des compétences vit sur sa propre branche, prêt à être développé ou à devenir une pull request.
Pourquoi l'ordre compte
La sûreté de cette correction dépend entièrement de créer la branche avant de réinitialiser :
git branch feature/skills sauvegarde le commit.
git reset --hard HEAD~1 ne fait alors que déplacer main.
Si vous lancez git reset --hard d'abord sans créer la branche, main recule et le commit n'est plus sur aucune branche. Il est généralement encore récupérable avec git reflog, mais brancher d'abord évite complètement la frayeur.
reset --hard réécrit l'historique. C'est sûr ici parce que main n'a pas été poussé. Sur un main partagé, annulez avec git revert.
Déplacer des commits entre branches : les recettes courantes
cherry-pick copie le commit sur la branche cible : même modification, un nouveau hash.
La correction dépend de l'endroit où le commit doit aller et de s'il a été poussé :
- Commité sur
main, à mettre sur une nouvelle branche (local seulement) — git branch feature, puis git reset --hard HEAD~1 sur main. Le commit vit désormais sur feature.
- Le déplacer sur une branche existante —
git checkout target, git cherry-pick <commit>, puis le supprimer de la source avec git reset --hard.
- Déplacer plusieurs commits — branchez d'abord pour tous les conserver, puis
git reset --hard HEAD~N ; ou faites un cherry-pick d'une plage précise sur la cible.
- Le commit a déjà été poussé — ne réécrivez pas l'historique public. Annulez-le sur la branche partagée avec
git revert et réappliquez le travail sur une branche de feature.
Entraînez-vous au cas local dans le terminal ici jusqu'à ce que le réflexe « brancher, puis reset » soit automatique ; c'est celui vers lequel vous vous tournerez le plus souvent.