web-dev-qa-db-fra.com

Supprimer / annuler une fusion sur Sourcetree

J'ai apporté assez peu de modifications à mon projet (je travaillais sur une branche distante et non sur le maître), je les ai validées, j'ai créé une demande d'extraction sur BitBucket et fusionné la branche avec le maître. J'avais oublié de pousser mes modifications après le commit. Maintenant, après avoir essayé de basculer la branche actuelle vers ma branche distante et de revenir au commit avant la fusion, j'ai réussi à récupérer toutes mes modifications et à les sauvegarder ailleurs sur mon système. Ce que je veux faire maintenant, c'est annuler la mauvaise fusion que j'ai faite. Chaque fois que je clique sur la fusion et que je sélectionne "commit inversé", le message d'erreur suivant s'affiche:

"erreur: la validation est une fusion mais aucune option -m n’a été donnée.

fatal: le retour a échoué "

Les branches ressemblent à ceci maintenant:

enter image description here

Je souhaite supprimer la fusion et l'amener dans un état tel qu'il ne dise plus master(4 behind).

50
Rameez Hussain

Cette méthode est basée sur la suppression de l'historique:

  1. Découvrez la branche sur laquelle vous avez commis l'erreur
  2. Faites un clic droit sur le commit sur lequel vous souhaitez réinitialiser la branche
  3. Cliquez sur "Réinitialiser la branche actuelle à ce commit"
  4. Sélectionnez le mode "Difficile" et cliquez sur "OK"
  5. Malheureusement, vous avez besoin d'un terminal pour faire ce bit. Tapez git Push Origin name_of_branch --force dans le terminal (vous devrez peut-être entrer votre nom d'utilisateur et votre mot de passe pour le dépôt git afin d'accepter la commande)

pdate: La version actuelle de l’arborescence des sources prend en charge les transmissions forcées. Cela signifie que vous n'avez pas besoin d'utiliser la commande mentionnée à l'étape 5! Il y a une case à cocher visible lorsque vous appuyez qui est étiqueté "force". Il est généralement désactivé.

Comment activer la case à cocher Force Push:

  1. "Outils" (dans la barre bleue en haut de l'écran)
  2. "Options"
  3. Onglet "Git"
  4. "Activer Force Push" (2ème section)
  5. "D'ACCORD"

Cochez cette case lorsque vous appuyez sur pour corriger également l'erreur sur le serveur d'origine.

C’est probablement la façon la plus simple de le faire, mais comme elle est basée sur la suppression de l’historique, si d’autres travaillent sur le projet, assurez-vous de leur faire savoir ce que vous faites afin de ne pas endommager le dépôt git de quiconque.

84
Daniel Tonon

Il est très regrettable que SourceTree ne vous permette pas de restaurer facilement les commits de fusion (du moins dans Windows SourceTree 1.5.2.0). Cependant, annuler la fusion peut facilement être effectué à partir de la ligne de commande, mais voulez-vous annuler la fusion en ajoutant un autre commit qui est l'inverse des résultats du commit de fusion ou voulez-vous simplement supprimer le commit de fusion de l'historique?

Si vous ne partagez pas votre branche master avec d'autres personnes, la solution la plus simple consiste à effectuer une réinitialisation matérielle afin de supprimer le commit de fusion de l'historique. Cependant, si d'autres personnes possèdent déjà une copie de ce commit de fusion, vous créerez un travail supplémentaire pour elles lorsqu'elles tenteront de resynchroniser leurs copies de master avec la version réécrite de la vôtre.

Vous devez donc déterminer quelle option vous souhaitez utiliser. Je vais donner les étapes pour les deux, en utilisant la ligne de commande:

Supprimer la validation de l'historique

git checkout master
git Push Origin master --force

Cela écrasera le commit de fusion sur Origin/master avec l'état actuel de votre branche locale master, supprimant ainsi le commit de fusion.

Annuler la validation avec une autre validation inversée

git checkout master
git merge Origin/master
git revert -m 1 HEAD

Cela amènera votre branche locale master en synchronisation avec Origin/master, et vous pouvez ensuite ajouter une validation inversée en indiquant git revert que le 1st parent est celui qui doit être considéré comme le parent "principal" et créera la validation inversée relative aux modifications apportées par l'autre validation parent.

Si, par la suite, vous décidez de réintégrer les modifications de l'autre parent, vous devez ajouter un autre commit de réversion qui annule le commit de réversion que vous venez de faire (technique appelée "annuler l'inversion").

Voir également:

  1. Annuler une fusion Git ?.
  2. Comment "annuler" l'annulation "d'un commit Git annulé? .
  3. git-revert (1) Page de manuel .
  4. Comment annuler une fusion défectueuse .
35
user456814

J'ai trouvé un autre moyen sans lignes de commande, un peu moche mais fait le travail.

Effectuez une réinitialisation matérielle du commit que vous souhaitez annuler, allez dans le dossier du projet (Utiliser le Finder sous Mac ou Explorer sous Windows) et faites une copie de l'intégralité du dossier. Ce que vous avez dans ce dossier "Copier" est le point que vous voulez être à la fin de ce processus.

Eh bien ... revenez à l’arborescence des sources et extrayez Head (la dernière mise à jour dans votre télécommande), puis accédez de nouveau au dossier du projet, assurez-vous que vous pouvez voir les dossiers cachés car vous devez pouvoir voir un dossier appelé ". git "

project folder

Supprimez tout MAIS ".git" de votre projet actuel, cela signifie que votre projet actuel ne contient que le dossier appelé ".git", puis accédez à votre dossier "Copier" et copiez tout ce qui reste sauf le dossier ".git" et collez le contenu. dans votre projet actuel (celui avec le dossier ".git" uniquement)

Terminé. Accédez à l'arborescence source et validez les modifications, votre projet se trouve exactement à l'endroit souhaité et toutes les modifications ont été supprimées.

La fin.


Obs1: Supprimez maintenant le dossier "Copier" pour nettoyer votre ordinateur des fichiers corrompus.

Obs2: Ce processus ne supprime pas vos modifications de Git, les validations seront là, ce que vous faites est de supprimer vos modifications et de les valider.

1
Fernando Bonet