Quelqu'un a accepté une pull request qu'il ne devrait pas avoir. Maintenant, nous avons un tas de code cassé fusionné. Comment annuler une pull request? J'allais simplement annuler les modifications apportées au commit juste avant la fusion, mais j'ai remarqué qu'il fusionnait dans un tas de commits. Alors maintenant, il y a tous ces engagements de cette personne des jours avant la fusion. Comment pouvez-vous annuler cela?
git
github
merge
pull-request
Volonté
la source
la source
Réponses:
Il y a une meilleure réponse à ce problème, même si je pourrais simplement le décomposer étape par étape.
Vous devrez récupérer et vérifier les dernières modifications en amont comme ceci, par exemple:
En jetant un œil au journal de validation, vous devriez trouver quelque chose de similaire à ceci:
Vous souhaitez maintenant annuler l'intégralité de la demande d'extraction avec la possibilité de l'annuler plus tard. Pour ce faire, vous devrez prendre l'ID du commit de fusion .
Dans l'exemple ci-dessus, le commit de fusion est celui du haut où il est dit "Merged pull request # 123 ..." .
Faites ceci pour annuler les deux modifications ( "Ajouter une barre" et "Ajouter foo" ) et vous vous retrouverez avec dans un seul commit annulant l'intégralité de la pull request que vous pourrez annuler plus tard et garder l'historique des modifications propre:
la source
git checkout upstream/master -b revert/john/foo_and_bar
? que fait-il exactement?Regardez votre graphe de commit (avec gitk ou un programme similaire). Vous verrez des validations de la demande d'extraction, et vous verrez vos propres validations et une validation de fusion (s'il ne s'agissait pas d'une fusion à avance rapide). Il vous suffit de trouver le dernier de vos propres commits avant la fusion et de réinitialiser la branche sur ce commit.
(Si vous avez le reflog de la branche, il devrait être encore plus facile de trouver le commit avant la fusion.)
(Modifier après plus d'informations dans les commentaires :)
D'accord, regardons le graphique:
Je suppose que le dernier commit (le plus à droite) était votre mauvaise fusion par pull request , qui a fusionné la ligne bleue vue ici. Votre dernier bon commit serait celui avant sur la ligne noire, ici marqué en rouge:
Réinitialisez ce commit, et tout devrait bien se passer.
Cela signifie que, dans votre copie de travail locale, faites ceci (après vous être assuré que vous n'avez plus de choses non validées, par exemple par git stash):
Maintenant, confirmez que vous êtes vraiment sur le commit que j'ai marqué là-bas, et vous ne verrez aucun des éléments tirés dans son ascendance.
(si votre télécommande github est nommée
origin
- sinon changez le nom).Maintenant, tout devrait également avoir l'air correct sur github. Les commits seront toujours dans votre référentiel, mais ne seront accessibles par aucune branche, donc ne devraient pas y faire de mal. (Et ils seront toujours sur le référentiel de RogerPaladin, bien sûr.)
(Il peut y avoir un moyen spécifique à Github de faire la même chose sur le Web, mais je ne suis pas trop familier avec Github et son système de gestion des demandes d'extraction.)
Notez que si quelqu'un d'autre a déjà retiré votre master avec le mauvais commit, il a alors le même problème que vous avez actuellement et ne peut pas vraiment contribuer. avant de réinitialiser votre nouvelle version principale.
S'il est probable que cela se soit produit, ou si vous souhaitez simplement éviter tout problème, utilisez la
git revert
commande à la place degit reset
, pour annuler les modifications avec un nouveau commit, au lieu de revenir à un ancien. (Certaines personnes pensent que vous ne devriez jamais effectuer de réinitialisation avec les branches publiées.) Consultez les autres réponses à cette question pour savoir comment procéder.Pour le futur:
Si vous ne voulez que certains des commits de la branche de RogerPaladin, envisagez d'utiliser à la
cherry-pick
place demerge
. Ou communiquez avec RogerPaladin pour les déplacer vers une succursale distincte et envoyer une nouvelle demande d'extraction.la source
reset --hard
Si l'attraction était la dernière chose qu'il a faite alors
la source
git reset --hard HEAD~1
, j'avais l'habitudegit push origin -f
de mettre à jour le référentiel distant. Mais soyez prudent, soyez prudent avant de faire cela.À partir du 24 juin 2014, vous pouvez essayer d'annuler facilement un PR (voir « Annuler une demande de tirage ») avec:
Présentation du bouton Revert
Il reste à tester si ce retour utilise
-m
ou non (pour le retour des fusions également)Mais Adil H Raza ajoute dans les commentaires (décembre 2019):
Attention : Korayem souligne dans les commentaires que:
Korayem nous renvoie à " Github: Modifications ignorées après revert (
git cherry-pick
,git rebase
) " pour en savoir plus.la source
Pour annuler une demande d'extraction github avec des validations 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 validations de la demande d'extraction sans influencer les validations dans l'historique.
Un bon moyen de le trouver est d'aller à la demande d'extraction maintenant fermée et de trouver ce champ:
Pull Request Image
Après avoir exécuté le
git reset
, exécutez un:git push origin --force <branch name>
Cela devrait rétablir la branche avant la demande d'extraction SANS affecter les validations dans la branche parsemée dans l'historique des validations entre les validations de la demande d'extraction.
ÉDITER:
Si vous cliquez sur le bouton de retour sur la demande d'extraction, cela crée un commit supplémentaire sur la branche. Il N'EST PAS annulé ou annulé. Cela signifie que si vous appuyez sur le bouton de retour, vous ne pouvez pas ouvrir une nouvelle demande d'extraction pour rajouter tout ce code.
la source
J'utilise cet endroit tout le temps, merci.
Je cherchais comment annuler une pull request et je suis arrivé ici.
J'étais sur le point de juste
git reset --hard
"il y a longtemps" et de faire une avance rapide vers l'endroit où j'étais avant de faire la pull request.En plus de regarder ici, j'ai également demandé à mon collègue ce qu'il ferait, et il avait généralement une bonne réponse: en utilisant l'exemple de sortie dans la première réponse ci-dessus:
Comme pour la plupart des choses dans Git, si vous le faites d'une manière qui n'est pas facile, vous le faites probablement mal.
la source