Refaire une fusion inversée dans Git
j'ai rencontré un petit problème ici: j'avais une branche 28s
en Git, que j'ai fusionnée dans la branche générale develop
. Il s'avère que je l'avais fait trop vite, donc j'ai utilisé git-revert pour annuler la fusion. Maintenant, cependant , le moment est venu de fusionner 28s
en develop
, mais la commande git-merge voit la fusion originale, et annonce heureusement que tout va bien et que les branches ont déjà été fusionnées. Que dois-je faire maintenant? Créer un 'Revert' 28s - > develop""' s'engager? Ne semble pas être une bonne façon de le faire, mais je ne peux pas imaginer un autre pour le moment.
à quoi ressemble la structure de l'arbre:
6 réponses
vous devez"revenir en arrière". Dépend comment avez-vous revenir, il peut ne pas être aussi facile qu'il y paraît. Regardez le document officiel sur ce sujet .
---o---o---o---M---x---x---W---x---Y
/
---A---B-------------------C---D
pour permettre:
---o---o---o---M---x---x-------x-------*
/ /
---A---B-------------------C---D
mais est-ce que tout fonctionne? Bien sûr, il ne. Vous pouvez revenir à une fusion, et à partir d'un d'un point de vue purement technique, git l'a fait très naturellement et n'avait pas de réel difficulté.
Il vient de considéré comme un changement de "état avant la fusion" à "l'état après la fusion", et qu'il a été.
Rien de compliqué, rien de bizarre, rien de vraiment dangereux. Git le fera sans même y penser.donc d'un point de vue technique, il n'y a rien de mal à revenir sur une fusion, mais d'un point de vue de flux de travail, c'est quelque chose que vous devriez généralement essayer de éviter les .
si possible, par exemple, si vous trouvez un problème qui les a fusionnés dans l'arbre principal, plutôt que de revenir à la fusion, essayer vraiment difficile à :
- divisez le problème en deux dans la branche que vous avez fusionnée, et réparez-le,
- ou essayer d'inverser la propagation individuelle qui l'a causé.
Oui, c'est plus complexe, et non, ça ne va pas toujours marcher (parfois la réponse est: "Oups, je n'aurais vraiment pas dû la fusionner, parce qu'elle n'était pas prêt encore, et je dois vraiment annuler tous de la fusion"). Alors vous vraiment devrait revenir à la fusion, mais quand vous voulez re-faire la fusion, vous maintenant, il faut le faire en inversant le retour.
supposons que vous ayez une telle histoire
---o---o---o---M---W---x-------x-------*
/
---A---B
où A, B failed commits et W-is revert de M
donc, avant de commencer à réparer les problèmes trouvés, je fais un choix de W s'engager dans ma branche
git cherry-pick -x W
Puis-je revenir W s'engager sur ma branche
git revert W
après que je puisse continuer à fixer.
La finale de l'histoire pourrait ressembler à:
---o---o---o---M---W---x-------x-------*
/ /
---A---B---W---W`----------C---D
quand j'envoie un PR, cela montrera clairement que PR n'est pas revert et ajoute de nouvelles propagations.
pour revenir en arrière sans trop gâcher votre flux de travail:
- Créer un local poubelle copie de développer
- Revenir revenir s'engager sur la copie locale de se développer
- Fusionner copier dans votre branche, et poussez votre branche à votre serveur git.
votre branche de fonctionnalité devrait maintenant pouvoir être fusionnée en tant que normale lorsque vous êtes prêt. Le seul inconvénient voici que vous aurez un peu plus de merge/revert commits dans votre histoire.
au Lieu d'utiliser git-revert
vous auriez pu utiliser cette commande dans le devel
branche jeter (annuler) le mauvais commit de fusion (au lieu de simplement revenir).
git checkout devel
git reset --hard COMMIT_BEFORE_WRONG_MERGE
ceci ajustera également le contenu du répertoire de travail en conséquence. Être prudent :
- Enregistrez vos modifications dans la branche de développement (depuis la mauvaise fusionner) parce qu'ils
trop sera effacé par le
git-reset
. Toutes les propagations après celle que vous spécifiez comme l'argumentgit reset
aura disparu! - de plus, ne faites pas cela si vos modifications ont déjà été extraites d'autres dépôts. parce que la réinitialisation va réécrire l'histoire.
je recommande d'étudier attentivement la page de manuel git-reset
avant d'essayer ceci.
maintenant, après la réinitialisation, vous pouvez appliquer vos modifications devel
et puis faire
git checkout devel
git merge 28s
Ce sera une véritable fusion de 28s
en devel
comme le premier (qui est maintenant
effacé de l'histoire de git).
je viens de trouver ce post en faisant face au même problème. Je trouve au-dessus de wayyy effrayant de faire reset hards etc. Je finirai par supprimer quelque chose que je ne veux pas, et je ne pourrai pas le récupérer.
au lieu de cela, j'ai vérifié le commit que je voulais que la branche remonte à par exemple git checkout 123466t7632723
. Puis converti en une branche git checkout my-new-branch
. J'ai ensuite supprimé la branche que je ne voulais plus. Bien sûr, cela ne fonctionnera que si vous êtes en mesure de jeter la branche que vous foiré.
pour revenir en arrière:
git revert <commit-hash-of-previous-revert>