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?
Réponses
Trop de publicités?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
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:
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:
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.
À partir de juin 24, 2014, vous pouvez essayer d'annuler un PR facilement (Voir "le Rétablissement d'un pull request"):
vous pouvez facilement revenir à une pull request sur GitHub en cliquant sur Rétablir:
Vous serez invité à en créer une nouvelle demande de pull avec le revenue de changements:
Il reste à tester si si c'revenir utilise -m
ou pas (pour revenir fusionne ainsi)