Supprimer une validation de fusion, en conservant les modifications en cours
Nous avons eu un petit problème dans notre équipe. Un dev avait pour inclure quelques changements dans notre branche de développement. Avant de le faire, il a accidentellement de fusionner une branche (ce qui ne devrait pas être fusionné à l'époque) et a continué à travailler sur ces changements, la génération d'un couple de s'engage après la fusion.
Maintenant, nous voulons garder ces changements, mais de les appliquer à la validation avant la fusion a été fait. Pour la protéger:
A (+b, +a)
|
B (+a)
|
C (merge commit)
|\
D \
| E (feature branch)
| /
|/
F
Ce que nous voulons avoir ses changements (+a,+b) appliqué au-dessus de commettre D . L'équivalent à:
C (+a,+b)
|
D
| E (feature branch)
| /
|/
F
Comment peut-on commettre un changement de rejeter un précédent de fusion et de maintien de modifications locales?
source d'informationauteur khose | 2014-01-14
Vous devez vous connecter pour publier un commentaire.
C'est un travail pour
git rebase -i
. Exécuter:Vous serez présenté avec une liste de commits dans
${EDITOR}
comme suit:Supprimer la
pick fb54c42 E
ligne à supprimer qui s'engagent. (Aussi, si vous voulezA
etB
être combinés en un seul commit, vous pouvez modifier lapick
commande poursquash
--squash 6c61a52 A
). Enregistrez et fermez le fichier et vos branches seront dans l'état que vous souhaitez.Noter que cela va changer l'histoire. Cela signifie que vous aurez besoin de faire un
git push -f
si vous avez déjà poussé la branche n'importe où, et ça plaisante pas avec quelqu'un d'autre qui collaborent à cette branche. Si c'est un problème, vous pouvezgit revert
la fusion s'engager à la place:La
-m 1
argument indique à git pour revenir à l'encontre de la première mère de l'engagement, qui est le côté qui a été fusionnée dans la (D
dans votre schéma).Je n'arrive pas à comprendre dans quelle direction la chronologie est dans vos exemples (qui commet sont faits avant de qui) je vais donc expliquer en termes généraux:
git cherry-pick A
etB
là pour apporter les modifications apportées par le deveoper dans un processus de fusion s'engager.Maintenant votre nouvelle branche contient l'histoire comme il se devait regarder de sorte que vous pourriez maintenant
git reset --hard
votre original succursale de de cet état. Être conscient que la force-le poussant à un référentiel partagé et l'extraction par les autres développeurs auront des répercussions évidentes sur pour eux: tout le monde aura àgit rebase
quel que soit le travail qu'ils ont fondée sur l'ancien état de cette branche à son nouvel état.Vous pouvez également "refork" la branche à côté de la "fixe" de la branche. Comme je l'ai dit, je n'ai pas réussi à voir si c'était fourche avant de commettre l'infraction d'après. Si cela a été fait avant, vous n'aurez pas besoin de la fixation de la branche.
Utilisation
git revert C
pour revenir à la C fusion commit (vous pourriez avoir à passer-m 1
de sorte que Git sait de quel côté de la fusion à garder). Voir Comment faire pour revenir à une défaillance de la fusion pour plus de détails et une élaboration de ce qui se passe si vous continuer à travailler sur la branche et, plus tard, décider de fusionner à nouveau.Revenir approche n'est pas de vous donner exactement ce que vous demandez; les changements apportés par la fusion sera toujours une partie de l'histoire du projet, mais leurs modifications seront perdues. Se débarrasser de la commet, et la fusion complètement nécessitera un rebase (et décrites dans les Cendres de Wilson réponse), ce qui nécessite un examen attentif et n'est généralement pas la valeur de l'effort, sauf s'il existe des restrictions juridiques ou des questions techniques (comme de gigantesques fichiers binaires) avec les commits qui sont arrivés par le biais de la fusion de commettre.
Si vous aviez un référentiel local plutôt que sur un dépôt distant, il aurait été facile.
local
distance
si c'est le scénario, vous avez juste à supprimer les deux caractéristiques locales-direction générale et le maître, puis obtenir/checkout sur le dépôt distant.
Espère que ça aide toujours. 🙂