Annuler les changements effectués par fusion
Le développeur a été la validation de petits changements pour les deux fichiers. Mais au cours de cette validation, il avait un conflit de fusion supprimé beaucoup de choses (n'a sans doute pas la dernière version à jour). Ensuite, il a été poussé à la partagé repo et quelques autres développeurs ont fait de certains autres commits.
Maintenant, nous avons remarqué, que la fusion supprimé les fichiers importants, et nous voulons revenir en arrière.
Comment puis-je le faire sans perdre les modifications à partir de la prochaine engage?
J'essayais de git revert commitsha
, mais il n'a pas apporté les modifications. Ai-je besoin de revenir la mergesha
? Comment puis-je savoir cela?
Vous devez vous connecter pour publier un commentaire.
git revert --mainline
Généralement:
Où:
dd8cbe3e4
est le revers de la fusion de validation que vous souhaitez annuler, et--mainline
vous indique laquelle des multiples précédentes s'engage est le seul à restaurer (rappelez-vous, une fusion s'engager a de multiples parent s'engage et vous pouvez ne garder qu'une seule d'entre elles).1
moyens, mais ma conjecture est que1,2,3...
correspond à une liste de mappages pour les engage immédiatement avantdd8cbe3e4
, triés par croissant ordre chronologique (les plus anciens en premier - ce qui est généralement ce que vous voulez revenir).Source:
http://thezencoder.com/2013/09/05/how-to-correctly-revert-a-bad-merge-in-git/
En bref, AVERTISSEMENT: il n'y a pas de véritable sûr moyen d'annuler une opération de fusion, sauf pour fait réinitialiser la direction générale de la validation avant la fusion.
Permettez-moi d'expliquer et de parcourir une référence existante pour l'instant.
Citant liés réponse de Comment voulez-vous revenir à une défaillance de la commande git commit de fusion
Certainement, la réinitialisation de la branche serait le plus simple, mais elle a des inconvénients si le résultat de la fusion a déjà été poussé à une salle de repo (parce que vous êtes effectivement réécriture publié l'histoire).
Voici la ventilation
git merge <someref>
de fusion (en option s'engager après la résolution des conflits)Si vous découvrez tout de suite que vous souhaitez réinitialiser la branche d'avant la fusion:
si vous avez découvert que sur le tard,
par le reflog pour trouver le point avant la fusion. (
HEAD@{1}
est court pour la valeur précédente de l'actuel chef de référence, mais le reflog pistes un historique limité de valeurs pour la tête de référence)réinitialiser la branche
éventuellement rebase/cherry-pick les commits effectués après la fusion
pull --rebase
(b) ne jamais modifier les conflits de fusion la fusion commit (c) ne pas bork fusionne (d) permettregit-rerere
L'autre (plus safe) approche consiste à créer une diff entre le dernier bon et la version actuelle du fichier, puis de restaurer les pièces perdues par copie&coller.
Cela fonctionne toujours, n'a pas besoin de tout bizarre options de ligne de commande, et il n'a pas de sabotage avec des choses que vous devriez laisser seul 🙂
Eclipse, par exemple, a de bons outils à la cerise choisir chaque différence et de la copie de chaque version. Suffit d'utiliser la fonction "Comparer" menu pour ouvrir les deux versions côte à côte.
En bref, vous pouvez faire un
git reset --soft <commit>
où commit peut être
HEAD^
(précédent),HEAD~2
(courant-2), SHA, etc.Avec --soft tous les changements seront prêt à s'engager, de sorte que vous pouvez réellement changer la commettre. Avec --dur les changements seront tous perdus.
Après que vous avez modifié le commit que vous avez à force de pousser les modifications à la partagé repo avec
git push --force
.Notez que vous aurez besoin de dire à l'autre que les développeurs devraient rebase leur repos sur l'partagé des pensions. (utiliser
git pull --rebase
). Ils pourraient obtenir certains conflits de fusion si... s'il vous Plaît garder cela à l'esprit.