Git pousse vers la mauvaise branche

99

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

Maintenant, je dois supprimer d'une certaine manière mes modifications dans false_branch et valider et pousser les modifications dans right_branch

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

Merci

Alessandro De Simone
la source
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 ne pourrait pas être une bonne motivation
Alessandro De Simone
3
De mon point de vue, ce n'est pas une réplique de ce que Halfdan a fait remarquer, car il s'agit également de déplacer les commits vers une autre branche, pas seulement de les supprimer.
olenz

Réponses:

142

passez à cette branche, vérifiez les git loget git revertces commits individuellement. Une fois que vous avez fait cela, revenez à la branche désirée et là, vous pouvez ensuite utiliser git cherry-pickpour choisir des commits spécifiques à partir des références git et les fusionner dans la bonne branche.

git checkout wrong_branch
git revert commitsha1
git revert commitsha2
git checkout right_branch
git cherry-pick commitsha1
git cherry-pick commitsha2

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

git checkout wrong_branch
git reset commitsha3 #commit just before commitsha2
git checkout right_branch
git cherry-pick commitsha1
git cherry-pick commitsha2
Dhruva Sagar
la source
Revert + cherry-pick semble beaucoup plus simple que les autres méthodes possibles impliquant la réinitialisation de la tête et / ou le rebasage.
ChrisV
2
Pour git cherry-pick, vous pouvez mettre plusieurs shas sur une seule ligne, c'est-à-dire git cherry-pick commitsha1 commitsha2.
ThomasW
Gareautrain! Et pas compliqué. Je vous remercie!
Craig Silver
que se passe-t-il lorsque vous voulez fusionner false_branch (par exemple, développer) dans right_branch (par exemple, fonctionnalité / X), puis vous obtenez les retours en annulant les changements que vous avez sélectionnés.
timB33
revertest tellement plus propre et moins dramatique qu'à resetmoins que vous ne vouliez vraiment supprimer quelque chose de sensible (informations d'identification?)
Numéro il y a
3

Le moyen le plus simple est d'utiliser git rebase. Supposons que vous ayez ce paramètre:

A -- B -- C -- C1 -- C2 # right branch
          \
           \-- D -- C3 -- C4 # wrong branch

Vous voulez déplacer le changement C3, C4 vers la branche droite.

git checkout -b new_wrong_branch D
git checkout wrong_branch
git rebase D --onto right_branch
git checkout right_branch
git merge right_branch wrong_branch
git branch -d wrong_branch
git branch rename new_wrong_branch wrong_branch

Maintenant, le réglage est

A -- B -- C -- C1 -- C2 -- C3 -- C4 # right_branch
          \
           \ -- D # wrong_branch

Ensuite, vous devez pousser vos résultats avec force (SI personne ne s'est encore synchronisé avec votre repo distant):

git push -f remote:right_branch
Olivier Verdier
la source
Je n'ai pas essayé cette solution, je travaillais déjà dans la première réponse (et cela a fonctionné). Je n'ai pas pensé au rebase, cela ressemble à une bonne alternative, merci
Alessandro De Simone
1
Plutôt qu'une git push -fmeilleure utilisation 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 au-dessus de vos commits.
Pierre-Olivier Vares
2

Un peu de raccourci pour ajouter à la réponse de Dhruva

git checkout wrong_branch
git revert commitsha1

git checkout right_branch
git push right_branch

git checkout wrong_branch
git reset commitsha2 #commit just before commitsha1
git push wrong_branch -f
tarikakyol
la source