Existe-t-il un moyen de refaire une fusion dans git?

17

J'ai donc fait une assez grosse erreur. J'ai fait un commit, tiré, fusionné (mais foiré le code en le faisant), puis poussé. Je voudrais refaire cette fusion et obtenir le bon code. Est-ce qu'il y a un moyen de faire ça?

J'utilise bitbucket.


la source
10
Juste une note - c'est en fait sur le sujet sur SO, et n'aurait pas dû être migré. Essayez de lire vos propres pages d'aide et notez les outils logiciels couramment utilisés par les programmeurs . Cela dit, c'est aussi sur le sujet ici - SwiftCore, ne vous sentez pas mal qu'il ait été migré, ce n'était pas de votre faute.
Bob

Réponses:

13

Je ne sais pas si c'est la façon "bénie" de le faire, mais voici ce que j'ai fait pour résoudre le même problème sans avoir à "forcer la poussée" ou quelque chose de grossier comme ça.

Supposons que votre historique ressemble à ceci (et M est la fusion flubbed):

-A--B--C--M (master points here)
  \      /
   D----E

L'exécution git checkout -b merge_fix <commit ID E>crée une branche avant que nous ne commettions d'erreur:

-A--B--C--M (master points here)
  \      /
   D----E (HEAD and merge_fix point here)

Maintenant, refaisons la fusion sur notre nouvelle branche. Nous ne pouvons pas simplement fusionner master, nous devons donc sélectionner manuellement le commit avant notre mauvaise fusion: git merge <commit ID C>ne faites pas les mêmes erreurs que la dernière fois!

-A--B--C--M (master points here)
  \      X
   D----E-G (HEAD and merge_fix point here)

En supposant que la validation Gsemble bonne, nous voulons maintenant synchroniser avec le haut de la masterbranche. Cette commande indique à git d'ignorer les modifications apportées au master et de forcer nos modifications à devenir le résultat de la fusion:git merge -s ours master

-A--B--C--M (master points here)
  \      X  \
   D----E-G--H (HEAD and merge_fix point here)

Enfin, (à nouveau en supposant que la validation Hsemble bonne, nous voulons avancer rapidement masterpour inclure notre fusion fixe:

git checkout master
git merge merge_fix

Cela ne fait que déplacer le masterpointeur de branche vers H, mais j'en profite pour nettoyer un peu mon art ASCII:

-A--B--C--M--H (HEAD, master, and merge_fix all point here)
  \      X  /
   D----E--G

Et voila! vous avez réussi à refaire la fusion sans invalider aucun historique!

mblythe
la source
6

Vous pouvez le faire, comme ceci:

  1. Réinitialisez le commit avant votre fusion.
  2. Effectuez à nouveau la fusion
  3. Force push

C'est:

git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname

N'oubliez pas que git push --forcecela réécrira tout ce que vous aviez dans la branche distante, et d'autres personnes utilisant cette branche peuvent également être affectées par cela. (Normalement, vous ne devriez pas faire cela.)

janos
la source
6
N'oubliez pas que faire git push --forcen'est pas sûr
Zepplock
1

git merge --abort puis vous pouvez fusionner à nouveau

Zepplock
la source
Je reçois juste un message "il n'y a pas de fusion à abandonner"
3
Cela ne peut être fait qu'en cas de conflits de fusion.
chanchal118
pourquoi le moins? cela m'a aidé.
swdev
Parce que la question concerne le moment où vous avez déjà terminé la fusion (incorrectement) et poussé.
Robin Green
-1

Veuillez vérifier cet espoir qui vous sera utile

https://www.kernel.org/pub/software/scm/git/docs/howto/revert-branch-rebase.html

la source
Bien que cela puisse répondre à la question OP, les réponses de lien uniquement ne sont pas bien acceptées sur SO. Vous pouvez cependant citer dans votre réponse les extraits les plus pertinents du lien.
Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien de référence. Les réponses de lien uniquement peuvent devenir invalides si la page liée change.
Pranav 웃