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 ? »Le bon outil dépend de deux choses : le nombre de commits à déplacer et
le fait que le travail soit déjà commité ou encore dans le répertoire de
travail. Repérez votre ligne dans le tableau, puis allez directement au
scénario correspondant. Tant que rien n'a été poussé sur le dépôt distant,
les quatre techniques sont réversibles grâce à git reflog, qui conserve
la trace de toutes les positions passées de vos branches pendant 90 jours par
défaut.
| 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à »Il faut mettre les modifications de côté le temps du changement de branche, car Git refuse de basculer si un fichier modifié diffère entre les deux branches.
git stashgit switch feature/logingit stash popgit stash enregistre vos modifications dans une pile dédiée
(la référence refs/stash) puis remet le répertoire de travail à l'état du
dernier commit. git stash pop réapplique l'entrée la plus récente sur la
branche courante et la supprime de la pile.
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 »Voici les quatre séquences complètes, dans l'ordre exact où les taper. Le
point commun de toutes celles qui déplacent des commits déjà créés : elles se
terminent par un reset --hard sur la branche d'origine. C'est cette
étape que l'on oublie le plus souvent, et son absence laisse les commits
présents sur les deux branches à la fois. Remplacez N par le nombre de
commits concernés.
| 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 »Les incidents rencontrés pendant un déplacement de commits viennent presque
toujours de deux sources : un conflit parce que la branche cible a évolué
de son côté, ou un reset --hard appliqué sur des commits déjà poussés.
Le second cas est le plus gênant car il désynchronise vos collègues.
Retrouvez votre message d'erreur dans la colonne de gauche pour identifier la
manœuvre de sortie.
| 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