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?
Il y a une meilleure réponse à ce problème, bien que je puisse simplement le décomposer étape par étape.
Vous devrez récupérer et récupérer les dernières modifications en amont, par exemple:
git fetch upstream
git checkout upstream/master -b revert/john/foo_and_bar
En regardant le journal de commit, vous devriez trouver quelque chose de similaire à ceci:
commit b76a5f1f5d3b323679e466a1a1d5f93c8828b269 Merge: 9271e6e a507888 Author: Tim Tom <[email protected]> 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 <[email protected]> Date: Mon Apr 29 12:13:29 2013 +0000 Add bar commit 470ee0f407198057d5cb1d6427bb8371eab6157e Author: John Doe <[email protected]> Date: Mon Apr 29 10:29:10 2013 +0000 Add foo
Désormais, vous souhaitez annuler l'intégralité de la demande d'extraction avec la possibilité d'annuler ultérieurement l'annulation ultérieure de la requête . Pour ce faire, vous devez utiliser l'ID de la validation de fusion.
Dans l'exemple ci-dessus, le fusion commit est le premier où il est indiqué "Demande d'extraction fusionnée # 123 ...".
Faites ceci pour annuler les deux modifications ("Ajouter une barre" et "Ajouter un toto") et vous obtiendrez en une seule validation le retour complet de la demande d'extraction que vous pourrez annuler ultérieurement ultérieurement. et garder l'historique des changements en ordre:
git revert -m 1 b76a5f1f5d3b323679e466a1a1d5f93c8828b269
Regardez votre graphique de commit (avec gitk ou un programme similaire). Vous verrez les commits de la demande d'extraction, et vous verrez vos propres commits, ainsi qu'un commet de fusion (s'il ne s'agissait pas d'une fusion à avance rapide). Il vous suffit de rechercher le dernier de vos propres validations avant la fusion et de réinitialiser la branche sur ce commit.
(Si vous avez le reflet de la branche, il devrait être encore plus facile de trouver le commit avant la fusion.)
(Editer après plus d'informations dans les commentaires :)
D'accord, regardons le graphique:
Je suppose que le dernier (le plus à droite) commit était votre mauvais fusion par demande de pull, qui a fusionné la ligne bleue vue ici . Votre dernier bon commit serait celui qui se trouvait avant le ligne noire, ici marquée en rouge:
Réinitialiser à ce commettre, et ça devrait aller.
Cela signifie que, dans votre copie de travail locale, faites ceci (après vous être assuré que vous n'avez plus de données non validées, par exemple avec git stash):
git checkout master
git reset --hard 7a62674ba3df0853c63539175197a16122a739ef
gitk
Maintenant, confirmez que vous êtes vraiment sur le coup que j’ai marqué ici et que vous ne verrez aucun des éléments tirés de son ascendance.
git Push -f Origin master
(Si votre télécommande github est nommée Origin
- sinon changez le nom).
Maintenant, tout devrait bien paraître sur github. Les commits seront toujours dans votre référentiel, mais ne pourront être atteints par aucune branche, et ne devraient donc causer aucun dommage là-bas. (Et ils seront toujours sur le référentiel de Roger Paladin, bien sûr.)
(Il existe peut-être un moyen spécifique à Github de faire la même chose sur le Web, mais je ne connais pas trop Github et son système de gestion des demandes d'extraction.)
Notez que si quelqu'un d'autre a déjà tiré votre maître avec le mauvais commit, alors il a le même problème que vous et actuellement, et ne peut pas réellement contribuer en retour. avant de réinitialiser votre nouvelle version principale.
S'il est probable que cela se produise ou si vous souhaitez simplement éviter tout problème, utilisez la commande git revert
au lieu de git reset
pour annuler les modifications avec un nouveau commit, au lieu de revenir à un ancien. (Certaines personnes pensent que vous ne devriez jamais réinitialiser avec des branches publiées.) Voir les autres réponses à cette question sur la façon de procéder.
Pour le futur:
Si vous ne voulez que certains des commits de la branche de RogerPaladin, envisagez d'utiliser cherry-pick
au lieu de merge
. Ou bien communiquez avec RogerPaladin pour les transférer dans une branche distincte et envoyer une nouvelle demande d'extraction.
Si la traction était la dernière chose qu'il a faite alors
git reset --hard HEAD~1
À partir du 24 juin 2014, vous pouvez essayer d’annuler facilement un PR (voir " Annuler une demande de transfert ") avec:
vous pouvez facilement annuler une demande d'extraction sur GitHub en cliquant sur Inverser:
Vous serez invité à créer une nouvelle demande d'extraction avec les modifications annulées:
Il reste à tester si cette inversion utilise -m
ou non (pour annuler les fusions également)
Pour annuler une demande d'extraction github avec des commits que vous ne souhaitez pas supprimer, vous devez exécuter un:
git reset --hard --merge <commit hash>
le hachage de validation étant le commit AVANT de fusionner la demande d'extraction. Cela supprimera tous les commits de la demande d'extraction sans influencer les commits de l'historique.
Un bon moyen de trouver ceci est d'aller à la demande de tirage maintenant fermée et de trouver ce champ:
Après avoir exécuté le git reset
, exécutez a:
git Push Origin --force <branch name>
Cela devrait rétablir la branche avant la demande d'extraction SANS affecter les commits de la branche situés dans l'historique des validations entre les validations de la demande d'extraction.
MODIFIER:
Si vous deviez cliquer sur le bouton de retour sur la demande d'extraction, cela créera un commit supplémentaire sur la branche. Cela ne se désengage pas ni ne se défait. Cela signifie que si vous appuyez sur le bouton Revert, vous ne pourrez pas ouvrir une nouvelle demande d'extraction pour rajouter tout ce code.
J'utilise cet endroit tout le temps, merci.
Je cherchais comment annuler une demande de tirage et je suis arrivé ici.
J'étais sur le point de simplement git reset --hard
pour "il y a longtemps" etdo un retour rapide à l'endroit où j'étais avant de faire la demande de tirage.
En plus de regarder ici, j'ai également demandé à mon collègue ce qu'il ferait, Il avait généralement une bonne réponse: utiliser l'exemple de sortie dans La première réponse ci-dessus:
git reset --hard 9271e6e
Comme avec la plupart des choses dans Git, si vous le faites d'une manière qui n'est pas facile, Vous le faites probablement mal.