252 votes

Annuler une fusion par demande d'extraction?

Quelqu'un a accepté une demande de tirage qu’il ne devrait pas avoir. Nous avons maintenant un ensemble de codes erronés fusionnés. Comment annuler une demande d'extraction? J'allais juste revenir sur les modifications apportées au commit juste avant la fusion, mais j'ai remarqué qu'il était fusionné en un groupe de commits. Alors maintenant, il y a tous ces commits de cette personne des jours avant la fusion. Comment pouvez-vous annuler cela?

268voto

errordeveloper Points 1649

Il y a une meilleure réponse à ce problème, bien que je pourrais vous venez de rompre cette étape-par-étape.

Vous aurez besoin de chercher et extraire les derniers changements en amont comme, par exemple:

git fetch upstream
git checkout upstream/master -b revert/john/foo_and_bar

Prendre un coup d'oeil au journal de validation, vous devriez trouver quelque chose de similaire à ceci:

commit b76a5f1f5d3b323679e466a1a1d5f93c8828b269
Merge: 9271e6e a507888
Author: Tim Tom <tim@tom.com>
Date:   Mon Apr 29 06:12:38 2013 -0700

    Merge pull request #123 from john/foo_and_bar

    Add foo and bar

commit a507888e9fcc9e08b658c0b25414d1aeb1eef45e
Author: John Doe <john@doe.com>
Date:   Mon Apr 29 12:13:29 2013 +0000

    Add bar

commit 470ee0f407198057d5cb1d6427bb8371eab6157e
Author: John Doe <john@doe.com>
Date:   Mon Apr 29 10:29:10 2013 +0000

    Add foo

Maintenant vous voulez revenir l'ensemble de la demande d'extraction avec la capacité de unrevert plus tard. Pour ce faire, vous aurez besoin de prendre l'ID de la fusion de commettre.

Dans l'exemple ci-dessus, la fusion s'engager est celle d'en haut, où il est dit "Fusionné pull request #123...".

Faire revenir les deux modifications ("Ajouter la barre" et "Ajouter foo") et vous allez vous retrouver dans un commit revenir l'ensemble de la demande d'extraction de laquelle vous pouvez unrevert plus tard et de conserver l'historique des modifications propre:

git revert -m 1 b76a5f1f5d3b323679e466a1a1d5f93c8828b269

93voto

Paŭlo Ebermann Points 35526

Regardez votre commit graphique (avec gitk ou un programme similaire). Vous verrez s'engage par le biais de la demande, et vous verrez votre propre s'engage, et une fusion de commit (si ce n'était pas une avance rapide de fusion). Vous avez juste à trouver le dernier de vos propres révisions avant la fusion, et de réinitialiser la direction de ce commit.

(Si vous avez de la direction générale reflog, il devrait être encore plus facile de trouver de la validation avant la fusion.)


(Edit après plus d'information dans les commentaires:)

Ok, permet de regarder le graphique:

screenshot 1

Je suppose que le dernier (le plus à droite) s'engagent a été votre mal de fusion par pull request, qui a fusionné la ligne bleue vu ici. Votre dernière bonne commettre serait celle d'avant sur la ligne noire, ici marquée en rouge:

enter image description here

Réinitialiser à ce commit, et vous devriez être bien.

Cela signifie, dans votre copie de travail locale le faire (après que vous assurer que vous n'avez plus non validées des trucs, par exemple par git stash):

git checkout master
git reset --hard 7a62674ba3df0853c63539175197a16122a739ef
gitk 

Maintenant contrôler que vous êtes vraiment sur le point de commettre j'ai marqué là, et vous verrez rien de tiré des trucs dans son ascendance.

git push -f origin master

(si votre github à distance est nommé origin - sinon, le changement de nom).

Maintenant, tout devrait regarder à droite sur github, trop. Les commits seront toujours dans votre référentiel, mais pas accessible par n'importe quelle branche, ne devraient donc pas faire de mal. (Et ils le seront encore sur RogerPaladin du référentiel, bien sûr.)

(Il y a peut être un Github web spécifique, seule façon de faire la même chose, mais je ne suis pas trop familier avec Github et son pull request de la gestion du système.)

Notez que si quelqu'un d'autre est déjà peut-avez tiré votre maître avec le mauvais commit, puis ils ont le même problème que vous avez actuellement, et ne peut pas vraiment contribuer en retour. avant de réinitialiser votre nouvelle version principale.

Si il est probable que ce qui s'est passé, ou vous voulez simplement pour éviter tout problème, utilisez l' git revert commande à la place de git reset, pour annuler les modifications avec un nouveau commit, au lieu de revenir à une version plus ancienne. (Certaines personnes pensent que vous ne devriez jamais faire de réinitialisation à la publication des branches.) Voir les autres réponses à cette question sur la façon de le faire.

Pour l'avenir:

Si vous ne souhaitez que certains s'engage de RogerPaladin de la direction générale, considérez l'utilisation d' cherry-pick au lieu de merge. Ou de communiquer à RogerPaladin pour les déplacer vers une branche distincte et envoyer une nouvelle demande d'extraction.

49voto

samthebest Points 2097

Si la traction était la dernière chose qu'il a faite alors

 git reset --hard HEAD~1
 

46voto

VonC Points 414372

À partir de juin 24, 2014, vous pouvez essayer d'annuler un PR facilement (Voir "le Rétablissement d'un pull request"):

Introduction le Bouton Revert

vous pouvez facilement revenir à une pull request sur GitHub en cliquant sur Rétablir:

https://camo.githubusercontent.com/0d3350caf2bb1cba53123ffeafc00ca702b1b164/68747470733a2f2f6769746875622d696d616765732e73332e616d617a6f6e6177732e636f6d2f68656c702f70756c6c5f72657175657374732f7265766572742d70756c6c2d726571756573742d6c696e6b2e706e67

Vous serez invité à en créer une nouvelle demande de pull avec le revenue de changements:

https://camo.githubusercontent.com/973efae3cc2764fc1353885a6a45b9a518d9b78b/68747470733a2f2f6769746875622d696d616765732e73332e616d617a6f6e6177732e636f6d2f68656c702f70756c6c5f72657175657374732f7265766572742d70756c6c2d726571756573742d6e65772d70722e706e67

Il reste à tester si si c'revenir utilise -m ou pas (pour revenir fusionne ainsi)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X