Vous avez commité sur main alors que vous auriez dû être sur votre
feature branch ? C’est l’un des problèmes Git les plus fréquents. La
bonne nouvelle : rien n’est perdu. Ce guide vous montre comment déplacer
vos commits vers la bonne branche selon trois scénarios : dernier
commit, plusieurs commits, et modifications non commitées.
Prérequis : Les branches en bref et Cherry-pick.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Déplacer le dernier commit sur la bonne branche avec
reset+cherry-pick - Déplacer plusieurs commits en chaîne vers une autre branche
- Utiliser
stash+switchpour interrompre proprement un travail en cours - Réorganiser des branches entières avec
rebase --onto
Quel scénario vous concerne ?
Section intitulée « Quel scénario vous concerne ? »| Situation | Solution | Difficulté |
|---|---|---|
| 1 commit local sur la mauvaise branche | branch + reset | Facile |
| Plusieurs commits locaux | cherry-pick un par un | Moyen |
| Série de commits à déplacer | rebase --onto | Avancé |
| Modifications non commitées sur la mauvaise branche | stash + switch | Facile |
Scénario 1 : déplacer le dernier commit
Section intitulée « Scénario 1 : déplacer le dernier commit »Vous avez fait un commit sur main au lieu de feature/login :
main: A — B — C — D (votre commit par erreur)-
Créez la branche feature à partir de la position actuelle
Fenêtre de terminal git branch feature/loginLa branche
feature/loginpointe maintenant sur le commit D. -
Reculez main d’un commit
Fenêtre de terminal git reset --hard HEAD~1mainrevient au commit C. Le commit D existe toujours — il est surfeature/login. -
Basculez sur la bonne branche
Fenêtre de terminal git switch feature/login
Résultat :
main: A — B — Cfeature/login: A — B — C — D ✓Vérification :
git log --oneline -3# D doit apparaître dans feature/login mais plus dans mainScénario 2 : déplacer plusieurs commits
Section intitulée « Scénario 2 : déplacer plusieurs commits »Vous avez fait 3 commits sur main qui auraient dû être sur
feature/dashboard :
main: A — B — C — D — E — F ^-- ces 3 commits-
Notez les SHA des commits à déplacer
Fenêtre de terminal git log --oneline -5Sortie :
f1a2b3c (HEAD -> main) feat: page de statsd4e5f6a feat: graphiques dashboarda7b8c9d feat: layout dashboard1234567 fix: correction CSSabcdef0 feat: ajout headerLes commits
a7b8c9d,d4e5f6aetf1a2b3cdoivent être déplacés. -
Créez et basculez sur la branche cible
Fenêtre de terminal git switch -c feature/dashboard main~3Cela crée
feature/dashboardà partir du commit juste avant les 3 commits erronés. -
Cherry-pick les commits dans l’ordre
Fenêtre de terminal git cherry-pick a7b8c9d d4e5f6a f1a2b3cOu avec une plage :
Fenêtre de terminal git cherry-pick a7b8c9d^..f1a2b3c -
Revenez sur main et supprimez les commits
Fenêtre de terminal git switch maingit reset --hard HEAD~3
Vérification :
git log --oneline --all --graphLes 3 commits doivent apparaître sur feature/dashboard et avoir
disparu de main.
Scénario 3 : déplacer avec rebase —onto
Section intitulée « Scénario 3 : déplacer avec rebase —onto »Si les commits à déplacer forment une série continue et que la
branche cible existe déjà, rebase --onto est plus élégant que
plusieurs cherry-picks :
git rebase --onto feature/dashboard main~3 mainCette commande signifie : « prends les commits entre main~3 et main,
et rejoue-les sur feature/dashboard ».
Vérification après le rebase :
git log --oneline --all --graph# Les commits doivent apparaître sur feature/dashboard# main doit pointer sur le commit d'avant la série déplacéegit log main --oneline -3# Confirme que main ne contient plus les commits déplacésScénario 4 : modifications non commitées
Section intitulée « Scénario 4 : modifications non commitées »Vous avez commencé à modifier des fichiers mais pas encore commité, et vous réalisez que vous êtes sur la mauvaise branche.
Si la branche cible existe déjà
Section intitulée « Si la branche cible existe déjà »git stashgit switch feature/logingit stash popgit stash range vos modifications dans un tiroir temporaire.
stash pop les récupère sur la nouvelle branche.
Vérification :
git status# Les fichiers modifiés doivent apparaître comme "Changes not staged for commit"# ou "Changes to be committed" selon leur état initialgit diff --stat# Confirme que vos modifications sont bien sur la bonne brancheSi la branche cible n’existe pas encore
Section intitulée « Si la branche cible n’existe pas encore »Encore plus simple — git switch -c emporte automatiquement les
modifications non commitées :
git switch -c feature/loginVos fichiers modifiés suivent le changement de branche. Commitez-les normalement.
Si git switch refuse de changer de branche
Section intitulée « Si git switch refuse de changer de branche »Git refuse de changer de branche quand vos modifications entrent en conflit avec la branche cible :
error: Your local changes to the following files would be overwritten by checkoutSolution : stashez d’abord, puis changez de branche :
git stashgit switch feature/logingit stash popRécapitulatif des commandes
Section intitulée « Récapitulatif des commandes »| Situation | Commandes |
|---|---|
| 1 commit local | git branch feature → git reset --hard HEAD~1 → git switch feature |
| N commits locaux | git switch -c feature main~N → git cherry-pick SHA1^..SHAN → git switch main → git reset --hard HEAD~N |
| Série de commits | git rebase --onto target main~N main |
| Modifs non commitées | git stash → git switch branch → git stash pop |
| Nouvelle branche | git switch -c feature (les modifs suivent automatiquement) |
Dépannage : problèmes courants
Section intitulée « Dépannage : problèmes courants »| Symptôme | Cause probable | Solution |
|---|---|---|
cherry-pick crée des conflits | La branche cible a divergé | Résolvez les conflits, puis git cherry-pick --continue |
stash pop échoue avec conflits | Modifications incompatibles entre branches | Résolvez les conflits, puis git stash drop |
reset --hard a supprimé les commits sur main | Commit déjà poussé, les collègues sont cassés | git reflog + git reset --hard HEAD@{n} pour restaurer, puis utiliser revert |
| Les commits sont dupliqués (sur les 2 branches) | Oublié le reset --hard sur la branche d’origine | Exécutez le reset --hard HEAD~N sur la branche source |
rebase --onto n’a rien déplacé | Mauvais paramètres (plage vide) | Vérifiez : git rebase --onto <cible> <début_exclu> <fin_inclue> |
À retenir
Section intitulée « À retenir »- 1 commit local : créez la branche, puis
reset --hard HEAD~1sur la branche d’origine - Plusieurs commits :
cherry-pickun par un ou par plage (SHA^..SHA) - Série continue :
rebase --ontoest plus élégant que N cherry-picks - Pas encore commité :
git stash+git switch+git stash pop - Nouvelle branche :
git switch -c featureemporte les modifs non commitées automatiquement - N’oubliez jamais le
reset --hardsur la branche d’origine pour supprimer les commits dupliqués