136 votes

Pousser Git vers la mauvaise branche

Travailler avec git, après quelques 'commit', et quelques 'push', j'ai réalisé que j'utilise la mauvaise branche!

Maintenant je dois somehow retirer mes changements dans wrong_branch et committer et pusher les changements dans right_branch

Quelle est la meilleure (et la plus simple) façon de faire cela ?

0 votes

0 votes

Bonne question @tokland : 99% des développeurs Ruby utilisent git, et le projet sur lequel je travaille est en RoR ... mais je sais que cela pourrait ne pas être une bonne motivation

3 votes

De mon point de vue, ce n'est pas un doublon de ce que halfdan a remarqué, car il s'agit également de déplacer des validations vers une autre branche, pas seulement de les supprimer.

205voto

Dhruva Sagar Points 2266

Passer à cette branche, vérifier le git log et git revert ces commits individuellement. Une fois que vous avez fait cela, revenez à la branche souhaitée et vous pourrez alors utiliser git cherry-pick pour sélectionner des commits spécifiques à partir des références Git et les fusionner dans la bonne branche.

git checkout mauvaise_branche
git revert commitsha1
git revert commitsha2
git checkout bonne_branche
git cherry-pick commitsha1
git cherry-pick commitsha2

Si les commits sont regroupés ensemble et qu'il n'y a pas de commits poussés après vos commits "sales", vous pouvez même utiliser git reset pour ramener cette mauvaise branche à un état juste avant vos commits, puis suivre à nouveau en utilisant git cherry-pick pour obtenir vos commits dans la bonne branche.

git checkout mauvaise_branche
git reset commitsha3 # commit juste avant commitsha2
git checkout bonne_branche
git cherry-pick commitsha1
git cherry-pick commitsha2

5voto

Olivier Verdier Points 12332

La manière la plus simple est d'utiliser git rebase. Supposons que vous avez ce réglage :

A -- B -- C -- C1 -- C2 # branche correcte
          \
           \-- D -- C3 -- C4 # mauvaise branche

Vous voulez déplacer les changements C3,C4 vers la branche correcte.

git checkout -b nouvelle_mauvaise_branche D
git checkout mauvaise_branche
git rebase D --onto branche_correcte
git checkout branche_correcte
git merge branche_correcte mauvaise_branche
git branch -d mauvaise_branche
git branch rename nouvelle_mauvaise_branche mauvaise_branche

Maintenant le réglage est le suivant :

A -- B -- C -- C1 -- C2 -- C3 -- C4 # branche_correcte
          \
           \ -- D # mauvaise branche

Ensuite, vous devez pousser vos résultats avec force (SI personne n'a encore synchronisé avec votre dépôt distant) :

git push -f remote:branche_correcte

0 votes

Je n'ai pas essayé cette solution, j'étais déjà en train de travailler sur la première réponse (et cela a fonctionné). Je n'ai pas pensé au rebase, cela semble être une bonne alternative, merci

1 votes

Plutôt que d'utiliser git push -f, il vaut mieux utiliser git push --force-with-lease. Au moins, cela garantit que la référence distante ne sera mise à jour que si personne n'a poussé d'autres commits par dessus les vôtres.

2voto

trkaky Points 73

Un petit raccourci à ajouter à la réponse de Dhruva

git checkout mauvaise_branche
git revert commitsha1

git checkout bonne_branche
git push bonne_branche

git checkout mauvaise_branche
git reset commitsha2 #commit juste avant commitsha1
git push mauvaise_branche -f

-1voto

Samuel Akhaze Points 56

Je trouve plus facile de suivre ce processus si la branche correcte n'a pas encore été créée ou n'a pas de nouveaux commits et est un enfant direct de la mauvaise branche :

  • supprimez d'abord la bonne branche si elle existe déjà,
  • git checkout bonne-banche
  • git push bonne-banche
  • git checkout mauvaise-banche
  • git revert commitsha2 (ou le commit avant les mauvais commits)
  • git push -f sur la mauvaise branche

et tout sera comme si vous n'aviez jamais commis d'erreurs au départ.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X