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?
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!
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.)
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.
Réponses:
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):
L'exécution
git checkout -b merge_fix <commit ID E>
crée une branche avant que nous ne commettions d'erreur: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!En supposant que la validation
G
semble bonne, nous voulons maintenant synchroniser avec le haut de lamaster
branche. 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
Enfin, (à nouveau en supposant que la validation
H
semble bonne, nous voulons avancer rapidementmaster
pour inclure notre fusion fixe:Cela ne fait que déplacer le
master
pointeur de branche versH
, mais j'en profite pour nettoyer un peu mon art ASCII:Et voila! vous avez réussi à refaire la fusion sans invalider aucun historique!
la source
Vous pouvez le faire, comme ceci:
C'est:
N'oubliez pas que
git push --force
cela 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.)la source
git push --force
n'est pas sûrgit merge --abort
puis vous pouvez fusionner à nouveaula source
Veuillez vérifier cet espoir qui vous sera utile
la source