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.
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.
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):
-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 G
semble bonne, nous voulons maintenant synchroniser avec le haut de la master
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
-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 H
semble bonne, nous voulons avancer rapidement master
pour inclure notre fusion fixe:
git checkout master
git merge merge_fix
Cela ne fait que déplacer le master
pointeur 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!
Vous pouvez le faire, comme ceci:
C'est:
git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname
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.)
git push --force
n'est pas sûr
git merge --abort
puis vous pouvez fusionner à nouveau
Veuillez vérifier cet espoir qui vous sera utile
https://www.kernel.org/pub/software/scm/git/docs/howto/revert-branch-rebase.html