Wie kann ich eine GitHub-Pull-Anfrage mit git auschecken?

251

Ich möchte eine zuvor erstellte Pull-Anfrage (erstellt über die GitHub-Weboberfläche) auschecken. Ich suchte und fand verschiedene Orte, an denen ein refs / pull oder refs / pull / pr

Aber wenn ich fetch = +refs/pull/*/head:refs/remotes/origin/pr/*zur Git-Konfigurationsdatei hinzufüge und einen Git-Abruf mache

Was mache ich falsch? Sollte GitHub das Pull / XYZ-Zeug automatisch erstellen oder muss ich etwas konfigurieren?

GarfieldKlon
quelle
Wie sieht der gesamte Remote-Bereich Ihrer Konfigurationsdatei aus?
4
Mögliches Duplikat von Wie kann ich eine nicht zusammengeführte Pull-Anfrage für einen Zweig abrufen, den ich nicht besitze?
Ciro Santilli 法轮功 冠状 病 六四 事件 16
Mögliches Duplikat des Github-Klons aus der Pull-Anfrage?
BuZZ-dEE
Ich bin auf diese Frage gekommen, aber ich brauchte tatsächlich stackoverflow.com/q/1783405/2413303
EpicPandaForce
1
Der zweite Absatz ist kein vollständiger Satz. "Aber wenn ich hinzufüge ... und einen Git Fetch mache" - wenn du diese Dinge machst, was passiert dann?
cp.engr

Antworten:

384

Um eine Remote-PR in Ihr lokales Repo zu holen,

git fetch origin pull/ID/head:BRANCHNAME

Wo IDist die Pull-Anforderungs-ID und BRANCHNAMEder Name des neuen Zweigs, den Sie erstellen möchten. Sobald Sie den Zweig erstellt haben, dann einfach

git checkout BRANCHNAME

Weitere Informationen finden Sie in der offiziellen GitHub-Dokumentation .

Timbo
quelle
11
Ich habe dies verwendet, um einen PR von einem Upstream-Repo in mein lokales Gabel-Repo zu holen. Sie können den Ursprung auch durch den Upstream ersetzen.
Jngai1297
18
Mein Befehl sah git fetch origin pull/1/head:githubusernamenicht so aus, wie ich es erwartet hatte
Anthony
1
Wie kann ich zurückkehren?
fico7489
8
@Antoine BRANCHNAMEist das, was Sie den Zweig benennen möchten. Ich vermute, Sie haben versucht, einen Namen zu verwenden, der bereits vorhanden war (z. B. master) und der nicht funktioniert hat. Sie haben also Ihren Benutzernamen ausprobiert, der funktioniert hat, weil es keinen Zweig mit diesem Namen gab. Vielleicht verstehe ich falsch, was Sie gesagt haben.
Nateowami
1
Es kann vorkommen, dass Sie Ihr lokales Repo so konfiguriert haben, dass es originauf Ihre Gabel und upstream- auf das ursprüngliche Repository verweist ( siehe beispielsweise help.github.com/articles/configuring-a-remote-for-a-fork ). Achten Sie darauf , zu ändern , originum upstreamin dem genannten Befehl, wenn Sie Pull - Anforderung von der ursprünglichen Repo holen wollen.
MVLABAT
126

Dies wird abgerufen, ohne dass Sie einen Zweig benennen müssen:

git pull origin pull/939/head

Wie erhalte ich eine bestimmte Pull-Anfrage auf meinem Computer?

Steven Penny
quelle
Dies ist in der Tat ausreichend, tks
rll
Dieser hat für mich funktioniert, Timbos Abrufmethode hat etwas getan, aber nicht das Richtige
Malhal
29
Beachten Sie, dass wenn Sie dies beispielsweise in Ihrem Hauptzweig tun, dieser direkt in diesen Zweig übernommen wird. Wenn Sie die Pull-Anforderung zum Staging in einen separaten Zweig bringen möchten, versuchen Sie die Antwort von @ timbo.
Phoenix
3
Das Gleiche gilt für @phoenix. Ich möchte, dass der Pull-Request-Zweig auf meinem Computer unter einem eigenen Zweig dupliziert wird, nicht unter einem Master.
Paul Chernoch
Dies funktioniert auch, wenn Sie später Änderungen aus der Pull-Anforderung in Ihren lokalen Zweig ziehen möchten.
Luator
52

Dieser Kern beschreibt, was passiert ist, wenn Sie einen Git-Abruf durchführen:

Ändern Sie natürlich die Github-URL so, dass sie mit der URL Ihres Projekts übereinstimmt. Am Ende sieht es so aus:

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

Rufen Sie nun alle Pull-Anfragen ab:

$ 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
...

So überprüfen Sie eine bestimmte Pull-Anfrage:

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

In den Ausgaben 259 sind verschiedene Skripte aufgeführt, um diese Aufgabe zu automatisieren.
Das git-extras- Projekt schlägt den Befehl vor git-pr(implementiert in PR 262 ).

git-pr(1) - Checkt eine Pull-Anfrage lokal aus

ZUSAMMENFASSUNG

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

BESCHREIBUNG

Erstellt einen lokalen Zweig basierend auf einer GitHub-Pull-Anforderungsnummer und wechselt anschließend zu diesem Zweig.

Der Name der Fernbedienung, von der abgerufen werden soll. Der Standardwert ist origin.

BEISPIELE

Dies überprüft die Pull-Anfrage 226von 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'
VonC
quelle
38

Ich ziehe es vor, abzurufen und auszuchecken, ohne einen lokalen Zweig zu erstellen, und mich im Status "HEAD losgelöst" zu befinden . Dadurch kann ich die Pull-Anforderung schnell überprüfen, ohne meinen lokalen Computer mit unnötigen lokalen Zweigen zu belasten.

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

Wo IDist eine Pull-Anforderungs-ID und upstreamwo ist die ursprüngliche Pull-Anforderung erstellt worden (könnte es originzum Beispiel sein).

Ich hoffe, es hilft.

Andrew Ymaz
quelle
1
Ich mag diese Lösung. Einer der Vorteile besteht darin, dass Sie, wenn die PR mit mehr Commits aktualisiert wird, diese einfach erneut ausführen können und die neuen Commits eingezogen werden.
Alex Johnson
14

Unter Bezugnahme auf Steven Pennys Antwort ist es am besten, einen Testzweig zu erstellen und die PR zu testen. Also hier ist, was Sie tun würden.

  1. Erstellen Sie einen Testzweig, in den die PR lokal zusammengeführt werden soll. Angenommen, Sie befinden sich in der Hauptniederlassung:

git checkout -b test

  1. Holen Sie sich die PR-Änderungen in den Testzweig

git pull origin pull/939/head:test

Jetzt können Sie die Änderungen in diesem lokalen Testzweig (in diesem Fall als Test bezeichnet ) sicher testen und, sobald Sie zufrieden sind, wie gewohnt von GitHub zusammenführen.

bholagabbar
quelle
1
Ich würde noch einen Schritt weiter gehen - ich würde einen Arbeitsbaum erstellen, ihn auf einen neuen testZweig setzen und DANN die PR ziehen - auf diese Weise muss ich keine Zweige lokal wiederherstellen, wenn ich fertig bin. Ich entsorge nur den Arbeitsbaum. Tatsächlich checkout -bmache ich NIE mehr - ich erstelle immer einen Arbeitsbaum und verzweige dann. Festplatte ist billig. Natürlich habe ich ein Skript, das dies tut; Ich gebe nicht alle benötigten Befehle einzeln ein.
Mpersico
11

Wenn Sie Github.com verwenden, gehen Sie zu "Pull-Anforderungen", klicken Sie auf die entsprechende Pull-Anforderung und dann auf den Link "Befehlszeilenanweisungen": Befehlszeilenanweisungen bei Github.com

AmitB
quelle
Sagen wir, gibt es tatsächlich eine Möglichkeit - wenn Sie sich github.com ansehen, meine ich - die neuen / geänderten Dateien der PR herunterzuladen? Wenn Sie sich also ein Repo auf Github ansehen, können Sie auf die praktische Schaltfläche "Als Zip herunterladen" klicken oder ganz einfach durchklicken und sich einfach jede (gesamte) Datei des Projekts ansehen. Für PR kann ich nicht sehen, wie ich einfach durchklicken kann, um "die Datei anzusehen" - wissen Sie, was ich meine? Vermisse ich etwas Prost!
Fattie
9

Mit dem git configBefehl können Sie eine neue Regel schreiben .git/config, um Pull-Anforderungen aus dem Repository abzurufen:

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

Und dann einfach:

$ 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
Tomas Tomecek
quelle
7

Das Problem mit einigen der oben genannten Optionen ist, dass jemand, der nach dem Öffnen der PR mehr Commits an die PR sendet, nicht die aktuellste Version erhält. Für mich hat es am besten funktioniert: Gehen Sie zur PR und drücken Sie 'Commits', scrollen Sie nach unten , um den neuesten Commit-Hash zu sehen, Geben Sie hier die Bildbeschreibung ein und verwenden Sie dann einfach git checkout, d. H.

git checkout <commit number>

im obigen Beispiel

git checkout 0ba1a50

Ariel Gabizon
quelle
2
Ich habe genau dieses Problem mit dem git fetch origin pull/ID/head:BRANCHNAMEin stackoverflow.com/a/30584951/659732 erwähnten Ansatz getroffen . Danke für die Lösung!
Joewiz
6

Ich verwende Hub, ein Tool von Github: https://github.com/github/hub

Mit dem Auschecken eines Hubs vor Ort ist eine Pull-Anfrage vor Ort ganz einfach:

hub checkout https://github.com/owner/repo/pull/1234
or
hub pr checkout 1234
Daniel Wehner
quelle
5

Für Bitbucket müssen Sie das Wort pulldurch ersetzen pull-requests.

Zunächst können Sie den URL-Stil der Pull-Anforderung per git ls-remote originBefehl bestätigen.

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

Wie Sie sehen können, ist es refs/pull-requests/1503/fromstattrefs/pull/1503/from

Dann können Sie die Befehle einer der Antworten verwenden.

osexp2003
quelle
4

Ich habe aus Versehen fast das gleiche geschrieben, wie es von Git-Extras bereitgestellt wurde. Wenn Sie also einen einzelnen benutzerdefinierten Befehl bevorzugen, anstatt eine Reihe anderer zusätzlicher Befehle zu installieren, platzieren Sie diese git-prDatei einfach irgendwo in Ihrem $PATHund dann können Sie einfach schreiben:

git pr 42
// or
git pr upstream 42
// or
git pr https://github.com/peerigon/phridge/pull/1
Johannes Ewald
quelle
4

Wenn Sie dem Workflow "Github Fork" folgen, in dem Sie eine Fork erstellen und das Remote-Upstream-Repo hinzufügen:

14:47 $ git remote -v
origin  [email protected]:<yourname>/<repo_name>.git (fetch)
origin  [email protected]:<yourname>/<repo_name>.git (push)
upstream        [email protected]:<repo_owrer>/<repo_name>.git (fetch)
upstream        [email protected]:<repo_owner>/<repo_name>.git (push)

Um in Ihren aktuellen Zweig zu gelangen, würde Ihr Befehl folgendermaßen aussehen:

git pull upstream pull/<pull_request_number>/head

Um in einen neuen Zweig zu ziehen, würde der Code folgendermaßen aussehen:

git fetch upstream pull/<pull_request_number>/head:newbranch
init0
quelle
3

Github hat kürzlich ein CLI- Dienstprogramm namens Github-Cli veröffentlicht . Nach der Installation können Sie den Zweig einer Pull-Anfrage lokal anhand seiner ID auschecken

z.B: gh pr checkout 2267

Beachten Sie, dass sich dieses Paket noch in der Beta befindet

Bagerard
quelle
1

Holen Sie sich den Remote-PR-Zweig in den lokalen Zweig:

git fetch origin ‘remote_branch’:‘local_branch_name’

Stellen Sie den Upstream der lokalen Verzweigung auf die Remote-Verzweigung ein.

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

Wenn Sie die lokalen Änderungen erneut in den PR-Zweig übertragen möchten

git push origin HEAD:remote_PR_Branch_name

Elakya
quelle
0

Angenommen, Ihre Herkunfts- und Upstream-Informationen sind wie folgt

   $ git remote -v
   origin  [email protected]:<yourname>/<repo_name>.git (fetch)
   origin  [email protected]:<yourname>/<repo_name>.git (push)
   upstream   [email protected]:<repo_owner>/<repo_name>.git (fetch)
   upstream   [email protected]:<repo_owner>/<repo_name>.git (push)

und Ihr Filialname ist wie

   <repo_owner>:<BranchName>

dann

   git pull origin <BranchName>

soll den Job machen

PKA
quelle
Wenn Sie Code geteilt haben, versuchen Sie bitte, Ihren Code zu erklären
Yunus Temurlenk
-2

Wenn sich ihre Commits in der Hauptniederlassung ihres gegabelten Repos befinden, können Sie einfach Folgendes tun.

git fetch [email protected]:<repo_owner>/<repo_name>.git
git checkout FETCH_HEAD
Mark O'Sullivan
quelle