Aller au contenu
Développement medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Commit sur la mauvaise branche Git

9 min de lecture

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.

  • 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 + switch pour interrompre proprement un travail en cours
  • Réorganiser des branches entières avec rebase --onto
SituationSolutionDifficulté
1 commit local sur la mauvaise branchebranch + resetFacile
Plusieurs commits locauxcherry-pick un par unMoyen
Série de commits à déplacerrebase --ontoAvancé
Modifications non commitées sur la mauvaise branchestash + switchFacile

Vous avez fait un commit sur main au lieu de feature/login :

main: A — B — C — D (votre commit par erreur)
  1. Créez la branche feature à partir de la position actuelle

    Fenêtre de terminal
    git branch feature/login

    La branche feature/login pointe maintenant sur le commit D.

  2. Reculez main d’un commit

    Fenêtre de terminal
    git reset --hard HEAD~1

    main revient au commit C. Le commit D existe toujours — il est sur feature/login.

  3. Basculez sur la bonne branche

    Fenêtre de terminal
    git switch feature/login

Résultat :

main: A — B — C
feature/login: A — B — C — D ✓

Vérification :

Fenêtre de terminal
git log --oneline -3
# D doit apparaître dans feature/login mais plus dans main

Vous avez fait 3 commits sur main qui auraient dû être sur feature/dashboard :

main: A — B — C — D — E — F
^-- ces 3 commits
  1. Notez les SHA des commits à déplacer

    Fenêtre de terminal
    git log --oneline -5

    Sortie :

    f1a2b3c (HEAD -> main) feat: page de stats
    d4e5f6a feat: graphiques dashboard
    a7b8c9d feat: layout dashboard
    1234567 fix: correction CSS
    abcdef0 feat: ajout header

    Les commits a7b8c9d, d4e5f6a et f1a2b3c doivent être déplacés.

  2. Créez et basculez sur la branche cible

    Fenêtre de terminal
    git switch -c feature/dashboard main~3

    Cela crée feature/dashboard à partir du commit juste avant les 3 commits erronés.

  3. Cherry-pick les commits dans l’ordre

    Fenêtre de terminal
    git cherry-pick a7b8c9d d4e5f6a f1a2b3c

    Ou avec une plage :

    Fenêtre de terminal
    git cherry-pick a7b8c9d^..f1a2b3c
  4. Revenez sur main et supprimez les commits

    Fenêtre de terminal
    git switch main
    git reset --hard HEAD~3

Vérification :

Fenêtre de terminal
git log --oneline --all --graph

Les 3 commits doivent apparaître sur feature/dashboard et avoir disparu de main.

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 :

Fenêtre de terminal
git rebase --onto feature/dashboard main~3 main

Cette commande signifie : « prends les commits entre main~3 et main, et rejoue-les sur feature/dashboard ».

Vérification après le rebase :

Fenêtre de terminal
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ée
git log main --oneline -3
# Confirme que main ne contient plus les commits déplacés

Vous avez commencé à modifier des fichiers mais pas encore commité, et vous réalisez que vous êtes sur la mauvaise branche.

Fenêtre de terminal
git stash
git switch feature/login
git stash pop

git stash range vos modifications dans un tiroir temporaire. stash pop les récupère sur la nouvelle branche.

Vérification :

Fenêtre de terminal
git status
# Les fichiers modifiés doivent apparaître comme "Changes not staged for commit"
# ou "Changes to be committed" selon leur état initial
git diff --stat
# Confirme que vos modifications sont bien sur la bonne branche

Encore plus simple — git switch -c emporte automatiquement les modifications non commitées :

Fenêtre de terminal
git switch -c feature/login

Vos fichiers modifiés suivent le changement de branche. Commitez-les normalement.

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 checkout

Solution : stashez d’abord, puis changez de branche :

Fenêtre de terminal
git stash
git switch feature/login
git stash pop
SituationCommandes
1 commit localgit branch featuregit reset --hard HEAD~1git switch feature
N commits locauxgit switch -c feature main~Ngit cherry-pick SHA1^..SHANgit switch maingit reset --hard HEAD~N
Série de commitsgit rebase --onto target main~N main
Modifs non commitéesgit stashgit switch branchgit stash pop
Nouvelle branchegit switch -c feature (les modifs suivent automatiquement)
SymptômeCause probableSolution
cherry-pick crée des conflitsLa branche cible a divergéRésolvez les conflits, puis git cherry-pick --continue
stash pop échoue avec conflitsModifications incompatibles entre branchesRésolvez les conflits, puis git stash drop
reset --hard a supprimé les commits sur mainCommit déjà poussé, les collègues sont cassésgit 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’origineExé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>
  • 1 commit local : créez la branche, puis reset --hard HEAD~1 sur la branche d’origine
  • Plusieurs commits : cherry-pick un par un ou par plage (SHA^..SHA)
  • Série continue : rebase --onto est plus élégant que N cherry-picks
  • Pas encore commité : git stash + git switch + git stash pop
  • Nouvelle branche : git switch -c feature emporte les modifs non commitées automatiquement
  • N’oubliez jamais le reset --hard sur la branche d’origine pour supprimer les commits dupliqués

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn