Comment puis-je vérifier une demande de pull GitHub avec git?


251

Je voudrais vérifier une demande de pull précédemment créée (créée via l'interface Web GitHub). J'ai cherché et trouvé différents endroits où un refs / pull ou refs / pull / pr

Mais quand j'ajoute fetch = +refs/pull/*/head:refs/remotes/origin/pr/*au fichier de configuration git et fais un git fetch

Qu'est-ce que je fais mal? Est-ce que GitHub doit créer automatiquement les trucs pull / xyz, ou dois-je configurer quelque chose?


À quoi ressemble la section distante complète de votre fichier de configuration?



Je me suis retrouvé sur cette question, mais j'avais en fait besoin de stackoverflow.com/q/1783405/2413303
EpicPandaForce

1
Le deuxième paragraphe n'est pas une phrase complète. "Mais quand j'ajoute ... et fais un git fetch" - quand vous faites ces choses, que se passe-t-il?
cp.engr

Réponses:


385

Pour récupérer un PR distant dans votre référentiel local,

git fetch origin pull/ID/head:BRANCHNAME

IDest l'ID de demande d'extraction et BRANCHNAMEest le nom de la nouvelle branche que vous souhaitez créer. Une fois que vous avez créé la branche, alors simplement

git checkout BRANCHNAME

Consultez la documentation officielle de GitHub pour en savoir plus.


11
Je l'ai utilisé pour récupérer un pr d'un référentiel en amont dans mon référentiel fourchu local, vous pouvez également remplacer l'origine par en amont.
Jngai1297

18
Ma commande a fini par ressembler à git fetch origin pull/1/head:githubusernamece à quoi je m'attendais
Anthony

1
comment revenir?
fico7489

8
@Antoine BRANCHNAMEest ce que vous voulez nommer la branche. Je suppose que vous avez essayé d'utiliser un nom qui existait déjà (par exemple master) et qui ne fonctionnait pas, alors vous avez essayé votre nom d'utilisateur, qui a fonctionné, car il n'y avait pas de branche avec ce nom. Je comprends peut-être mal ce que vous disiez.
Nateowami

1
Il se peut que vous ayez configuré votre référentiel local de la manière qui originpointe vers votre fork et upstream- vers le référentiel d'origine (en suivant help.github.com/articles/configuring-a-remote-for-a-fork , par exemple). Assurez-vous de passer originà upstreamdans la commande mentionnée, si vous souhaitez récupérer la demande de tirage du dépôt d'origine.
mvlabat

126

Cela va chercher sans que vous ayez à nommer une branche:

git pull origin pull/939/head

Comment obtenir une demande d'extraction spécifique sur ma machine?


C'est suffisant en effet, tks
rll

Celui-ci a fonctionné pour moi, la méthode de récupération de timbo a fait quelque chose mais pas la bonne chose
malhal

30
Notez que si vous faites cela pendant que vous êtes sur votre branche principale, par exemple, il sera directement engagé dans cette branche. Si vous souhaitez placer la demande d'extraction dans une branche distincte pour la mise en attente, essayez la réponse de @ timbo.
phoenix

3
Idem ce qu'a dit @phoenix. Je veux que la branche pull request soit dupliquée sur ma machine sous sa propre branche, pas master.
Paul Chernoch

Cela fonctionne également si vous souhaitez ultérieurement extraire les modifications de la demande d'extraction dans votre branche locale.
luator

52

Cet essentiel décrit ce qui s'est passé lorsque vous effectuez une récupération git:

Évidemment, changez l'url github pour correspondre à l'URL de votre projet. Cela finit par ressembler à ceci:

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = git@github.com:joyent/node.git
    fetch = +refs/pull/*/head:refs/remotes/origin/pr/*

Maintenant, récupérez toutes les demandes de tirage:

$ git fetch origin
From github.com:joyent/node
 * [new ref]         refs/pull/1000/head -> origin/pr/1000
 * [new ref]         refs/pull/1002/head -> origin/pr/1002
 * [new ref]         refs/pull/1004/head -> origin/pr/1004
 * [new ref]         refs/pull/1009/head -> origin/pr/1009
...

Pour extraire une demande d'extraction particulière:

$ git checkout pr/999
Branch pr/999 set up to track remote branch pr/999 from origin.
Switched to a new branch 'pr/999'

Vous avez divers scripts répertoriés dans les problèmes 259 pour automatiser cette tâche.
Le projet git-extras propose la commande git-pr(implémentée dans PR 262 )

git-pr(1) - Extrait une demande de pull localement

SYNOPSIS

git-pr <number> [<remote>]
git-pr clean

LA DESCRIPTION

Crée une branche locale basée sur un numéro de demande d'extraction GitHub et basculez ensuite vers cette branche.

Nom de la télécommande à récupérer. Par défaut à origin.

EXEMPLES

Cela vérifie la demande d'extraction 226de origin:

$ git pr 226

remote: Counting objects: 12, done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 12 (delta 3), reused 9 (delta 3)
Unpacking objects: 100% (12/12), done.
From https://github.com/visionmedia/git-extras
  * [new ref] refs/pull/226/head -> pr/226
Switched to branch 'pr/226'

38

Je préfère récupérer et extraire sans créer de branche locale et être dans l' état HEAD détaché . Cela me permet de vérifier rapidement la demande de pull sans polluer ma machine locale avec des branches locales inutiles.

git fetch upstream pull/ID/head && git checkout FETCH_HEAD

IDest un ID de demande d'extraction et upstreamoù est la demande d'extraction d'origine a été créée (il peut s'agir origin, par exemple).

J'espère que ça aide.


1
J'aime cette solution. L'un des avantages est que si le PR est mis à jour avec plus de validations, vous pouvez à nouveau l'exécuter et il récupérera les nouvelles validations.
Alex Johnson

14

En référence à la réponse de Steven Penny, il est préférable de créer une branche de test et de tester le PR. Voici donc ce que vous feriez.

  1. Créez une branche de test pour fusionner le PR en local. En supposant que vous êtes sur la branche principale:

git checkout -b test

  1. Obtenez les modifications PR dans la branche de test

git pull origin pull/939/head:test

Maintenant, vous pouvez tester en toute sécurité les modifications sur cette branche de test locale (dans ce cas, nommé test ) et une fois que vous êtes satisfait, vous pouvez le fusionner comme d'habitude à partir de GitHub.


1
J'irais encore mieux - je créerais un arbre de travail, le définirais dans une nouvelle testbranche et ALORS tirerais le PR - de cette façon, je n'ai pas besoin de restaurer les branches localement une fois terminé; Je viens de disposer de l'arbre de travail. En fait, je ne suis JAMAIS checkout -bplus - je crée toujours un arbre de travail puis une branche. Le disque est bon marché. Bien sûr, j'ai un script qui fait ça; Je ne tape pas toutes les commandes nécessaires individuellement.
mpersico

11

Si vous utilisez Github.com, allez dans "Pull request", cliquez sur la pull request appropriée, puis sur le lien "command line instructions" link: instructions de ligne de commande sur Github.com


Dites, existe-t-il réellement un moyen - quand vous regardez sur github.com je veux dire - de télécharger les fichiers nouveaux / modifiés, du PR? Ainsi, lorsque vous regardez un dépôt sur github, vous pouvez cliquer sur le bouton pratique "télécharger sous forme de zip", ou bien, vous pouvez, tout simplement, cliquer à travers et simplement regarder chaque fichier (entier) du projet. Pour les relations publiques, je ne vois pas comment, simplement, cliquer pour "regarder le fichier" - savez-vous ce que je veux dire? Suis-je en train de manquer quelque chose? À votre santé!
Fattie

9

Vous pouvez utiliser la git configcommande pour écrire une nouvelle règle .git/configpour récupérer les demandes d'extraction à partir du référentiel:

$ git config --local --add remote.origin.fetch '+refs/pull/*/head:refs/remotes/origin/pr/*'

Et puis juste:

$ git fetch origin
Fetching origin
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 4 (delta 2), reused 4 (delta 2), pack-reused 0
Unpacking objects: 100% (4/4), done.
From https://github.com/container-images/memcached
 * [new ref]         refs/pull/2/head -> origin/pr/2
 * [new ref]         refs/pull/3/head -> origin/pr/3

8

Le problème avec certaines des options ci-dessus, c'est que si quelqu'un pousse plus de validations sur le PR après avoir ouvert le PR, il ne vous donnera pas la version la plus à jour. Pour moi, ce qui a le mieux fonctionné est - allez sur le PR, et appuyez sur «Commits», faites défiler vers le bas pour voir le hachage de validation le plus récent entrez la description de l'image ici , puis utilisez simplement git checkout, c'est-à-dire

git checkout <commit number>

dans l'exemple ci-dessus

git checkout 0ba1a50


2
J'ai rencontré exactement ce problème avec l' git fetch origin pull/ID/head:BRANCHNAMEapproche mentionnée dans stackoverflow.com/a/30584951/659732 . Merci pour la solution!
joewiz


5

Pour Bitbucket, vous devez remplacer le mot pullpar pull-requests.

Tout d'abord, vous pouvez confirmer le style d'URL de demande d'extraction par git ls-remote origincommande.

$ git ls-remote origin |grep pull
f3f40f2ca9509368c959b0b13729dc0ae2fbf2ae    refs/pull-requests/1503/from
da4666bd91eabcc6f2c214e0bbd99d543d94767e    refs/pull-requests/1503/merge
...

Comme vous pouvez le voir, c'est refs/pull-requests/1503/fromau lieu derefs/pull/1503/from

Ensuite, vous pouvez utiliser les commandes de l'une des réponses.


4

J'ai accidentellement fini par écrire presque la même chose que celle fournie par git-extras. Donc, si vous préférez une seule commande personnalisée au lieu d'installer un tas d'autres commandes supplémentaires, placez simplement ce git-prfichier quelque part dans votre $PATHet vous pourrez simplement écrire:

git pr 42
// or
git pr upstream 42
// or
git pr https://github.com/peerigon/phridge/pull/1

4

Si vous suivez le workflow "github fork", où vous créez un fork et ajoutez le dépôt distant en amont:

14:47 $ git remote -v
origin  git@github.com:<yourname>/<repo_name>.git (fetch)
origin  git@github.com:<yourname>/<repo_name>.git (push)
upstream        git@github.com:<repo_owrer>/<repo_name>.git (fetch)
upstream        git@github.com:<repo_owner>/<repo_name>.git (push)

pour tirer dans votre branche actuelle votre commande ressemblerait à:

git pull upstream pull/<pull_request_number>/head

pour entrer dans une nouvelle branche, le code ressemblerait à ceci:

git fetch upstream pull/<pull_request_number>/head:newbranch

3

Github a récemment publié un utilitaire cli appelé github-cli . Après l'avoir installé, vous pouvez extraire la branche d'une demande de pull localement en utilisant son id

par exemple: gh pr checkout 2267

Notez que ce package est toujours en version bêta


1

Obtenez la branche PR distante dans la branche locale:

git fetch origin ‘remote_branch’:‘local_branch_name’

Définissez l'amont de la branche locale sur la branche distante.

git branch --set-upstream-to=origin/PR_Branch_Name local_branch

Lorsque vous souhaitez repousser les modifications locales vers la branche PR

git push origin HEAD:remote_PR_Branch_name


0

Supposons que votre origine et vos informations en amont soient comme ci-dessous

   $ git remote -v
   origin  git@github.com:<yourname>/<repo_name>.git (fetch)
   origin  git@github.com:<yourname>/<repo_name>.git (push)
   upstream   git@github.com:<repo_owner>/<repo_name>.git (fetch)
   upstream   git@github.com:<repo_owner>/<repo_name>.git (push)

et votre nom de branche est comme

   <repo_owner>:<BranchName>

puis

   git pull origin <BranchName>

doit faire le travail


Lorsque vous avez partagé du code, veuillez essayer d'expliquer votre code
Yunus Temurlenk

-3

Si leurs validations sont sur la branche principale de leur dépôt fourchu, vous pouvez simplement faire ce qui suit.

git fetch git@github.com:<repo_owner>/<repo_name>.git
git checkout FETCH_HEAD
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.