Wie kann ich eine nicht zusammengeführte Pull-Anfrage für einen Zweig abrufen, den ich nicht besitze?


72

Ich muss eine bestimmte Pull-Anfrage (die noch nicht in den Hauptstrom verarbeitet wurde) im NServiceBus-Repo ziehen:

https://github.com/johnsimons/NServiceBus/commit/d8524d53094e8181716e771c1023e968132abc15

Es ist offensichtlich nicht mein Repo, aber ich brauche die Änderungen, die in dieser Pull-Anfrage vorhanden sind.

Was ist der beste Weg, dies zu tun?


Antworten:


76

So holen Sie einen Pull in Ihr Repository:

git fetch git@github.com:jboss/jboss-common-beans.git refs/pull/4/head

Dann machen Sie mit FETCH_HEAD, was Sie wollen:

git checkout -b new-branch FETCH_HEAD

1
Beim Versuch erhalte ich eine Fehlermeldung : fatal: Couldn't find remote ref refs/pull/1041/head. = /
Elias Dorneles

2
Sie möchten git@github.com:jboss/jboss-common-beans.gitals Fernbedienung einstellen upstreamund dann git fetch upstream refs/pull/4/head
Folgendes

Und wie drängen Sie dann auf PR?
Vitaliy Lebedev

Sie können nicht drücken , um / NN / head refs zu ziehen, sondern nur zu dem Zweig, den der PR verfolgt (siehe " Benutzer möchte zusammenführen ... vom Benutzer: Zweigname " unter PR-Titel). Wenn es nicht Ihre PR ist, können Sie häufig nicht pushen, aber es gibt verschiedene Möglichkeiten, wie der Autor die Erlaubnis geben kann. Help.github.com/articles/…
Beni Cherniavsky-Paskin

Was passiert, wenn der Benutzer die PR aktualisiert und ich das Update abrufen möchte?
Tina Chen


20

Du kannst das:

1) Fügen Sie die Upstream-Fernbedienung hinzu:

git remote add upstream git@github.com:Particular/NServiceBus.git

2) Danach können Sie jede Pull-Anfrage an einen neuen Zweig anhand seiner ID auschecken:

git fetch upstream pull/PULL_REQUEST_ID/head:NEW_BRANCH_NAME

Dann haben Sie einen Zweig NEW_BRANCH_NAMEmit dem Namen , der den PR-Code enthält.

Hinzufügen eines Alias:

Wenn Sie dies so oft wie ich tun, möchten Sie möglicherweise einige Aliase dafür einrichten . Ich habe dies in meiner .gitconfig:

[alias]
    fetch-pr = "!f(){\
        [ -z \"$1\" ] && { echo Usage: git fetch-pr PULL_REQUEST_ID [REMOTE_NAME] [NEW_BRANCH_NAME]; exit 1; }; \
        remote=${2:-origin}; \
        branch=${3:-pr-$1}; \
        git fetch $remote \"pull/$1/head:$branch\"; \
        }; f "
    pr = "!f(){\
        branch=${3:-pr-$1}; \
        git fetch-pr \"$@\"; \
        git switch $branch; \
        }; f "

Mit dem oben genannten kann ich tun:

git fetch-pr 123              # fetch PR #123 into branch pr-123
git fetch-pr 123 some-branch  # fetch PR #123 into some-branch
git pr 123                    # fetch and switch to the branch

4
Falls jemand vergisst, gibt es einen dritten Schritt: Git Checkout NEW_BRANCH_NAME
GoTop

8

In schwierigen Situationen (insbesondere wenn Sie kein ausgechecktes Git-Repo haben) ist es meiner Meinung nach am einfachsten, einen Patch anzuwenden. Öffnen Sie dazu einfach die Pull-Anfrage auf github und fügen Sie der URL ein ".patch" hinzu, laden Sie es herunter und wenden Sie den Patch an.

Beispiel:

cd cordova-plugin-media
wget https://github.com/apache/cordova-plugin-media/pull/120.patch
patch -p1 < 120.patch


4

Github / Hub

https://github.com/github/hub ist ein GitHub-CLI-Helfer, der diesen und andere Anwendungsfälle mithilfe zusätzlicher Informationen aus der GitHub-API auf wunderbare Weise behandelt. Z.B:

git clone https://github.com/github/hub
# Just copy paste the URL.
hub checkout https://github.com/github/hub/pull/970

Ergebnis:

  • Wir befinden uns jetzt in einem Zweig namens <USERID>-<BRANCH_NAME>PR.

    Beachten Sie den guten Filialnamen, der automatisch für uns festgelegt wurde.

  • Dieser Zweig ist so eingestellt, dass er den ursprünglichen Zweig auf der Gabelung verfolgt, dh .git/configenthält:

    [branch "<USERID>-<BRANCH_NAME>"]
        remote = retronym
        merge = refs/heads/ticket/969
        rebase = true
    

    Wenn also weitere Commits gepusht werden, können wir git fetchsie direkt durchführen.

Die Installation hubunter Linux ist derzeit schwierig, wenn Sie nicht mit Go vertraut sind, es sich aber lohnt. Unter Ubuntu 14.04 ist Go on the Repositories zu alt, daher ist GVM die beste Option:

bash < <(curl -LSs 'https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer')
. "$HOME/.gvm/scripts/gvm"
gvm install 'go1.4'
gvm use 'go1.4' --default
go get github.com/github/hub

Ich habe GitHub auch gebeten, uns ein Cheatsheet zum Kopieren und Einfügen auf der Web-Benutzeroberfläche unter https://github.com/isaacs/github/issues/449 zu geben


1
Haben Sie eine Quelle auf der refs/heads/ticket/NN? Ich habe diesen magischen Schiedsrichter noch nie gesehen pull/NN/head(das hubhat mir derzeit gegeben) & pull/NN/merge. nur neugierig ...
Beni Cherniavsky-Paskin

@ BeniCherniavsky-Paskin Hallo Beni, ich konnte keine Dokumente darauf finden. Ich denke, es sind die Vorteile der Verwendung von APIs, die Ihr eigenes Unternehmen erstellt hat.
Ciro Santilli 法轮功 冠状 病 六四 事件 18

Es kann nützlich sein, die Demo der Verwendung von Hub zu ändern, um ein anderes Github-Projekt zu verwenden - jedes andere als Hub. Andernfalls kann es verwirrend sein, dass Sie mit Hub auf Hub arbeiten.
Stason

es sieht so aus, als hätte der Hub vielleicht seine Funktionalität geändert, zumindest verstehe ich das nicht "<USERID>-<BRANCH_NAME>", aber den gleichen Filialnamen wie der Filialname des PR, ohne Benutzer-ID.
Stason

3

Sobald Sie das Upstream-Repo als Upstream-Remote hinzugefügt haben (wie @elias hervorhob):

$ git remote add upstream git@github.com:Particular/NServiceBus

Sie können git so konfigurieren, dass Pull-Anforderungen standardmäßig abgerufen werden:

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

Also, lass es uns holen:

$ git fetch upstream
Fetching upstream
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/Particular/NServiceBus
 * [new ref]         refs/pull/1/head -> upstream/pr/1
 * [new ref]         refs/pull/2/head -> upstream/pr/2

Und probieren Sie es aus:

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

3

Hier sind die Befehle, die für mich funktioniert haben.

Ich gehe davon aus, dass man bereits ein Repo (zB Pytorch ) lokal auf sein System geklont hat . Danach hat ein Freiwilliger / Enthusiast einen Code beigesteuert und eine PR für das Remote-Repository ausgegeben, die jedoch noch nicht mit dem Master oder einem anderen Zweig zusammengeführt wurde. Damit,

Zuerst müssen wir git remote adddas Github-Remote-Repository bearbeiten:

# I've given the name `original`; you can give some other name as per your liking
$ git remote add original https://github.com/pytorch/pytorch

Dann cdin das Repository pytorchund dann einfach:

# after this, the unmerged PR should be pulled to your local repo
$ git fetch original pull/<pull_number>/head    # 23, 123 etc.,

Jetzt wurde der ausstehende PR in Ihr lokales Repo abgerufen, und die Spitze Ihres Abrufs befindet sich in FETCH_HEAD. Wenn Sie diese ausstehende PR lokal zusammenführen möchten, gehen Sie einfach wie folgt vor:

$ git merge FETCH_HEAD

Wenn Sie danach:

$ git status

Sie sollten sehen können, dass das lokale Repo nCommits voraus ist , die Teil der ausstehenden PR waren (dh es ist möglich, mehr als 1 Commit in einer einzelnen PR auszugeben). Die Anzahl der Commits hängt also von den Commits ab, die in der ausstehenden PR enthalten sind.


0

Im Folgenden wird der Befehl 'git fetch' ausgeführt, um alle Pull-Anforderungen abzurufen, wenn "git fetch" ausgeführt wird.

füge unten in ~ / .gitconfig hinzu

[remote "origin"]
fetch = +refs/pull-requests/*/from:refs/remotes/origin/pr/*

Beachten Sie, dass die Referenz "refs / pull-request /" die Stash-Namenskonvention hat. Für Git Hub benötigen Sie möglicherweise ein anderes Format


0

Wenn Sie nur eine nicht zusammengeführte Pull-Anfrage von einem anderen Repo zu Ihrem eigenen hinzufügen möchten, sind nicht alle Komplikationen erforderlich (wie meistens in anderen Antworten gezeigt).

Gehen Sie stattdessen einfach in Ihr eigenes Repo und ziehen Sie das Commit (aus der PR-Quelle) mit seinem Commit-Hash ein.

git pull https://bitbucket.org/SomeUser/SomeProjectRepo/commits/c15...db2

Auf diese Weise erhalten Sie nur eine Reihe neuer bearbeiteter Dateien, als hätten Sie sie selbst bearbeitet. Es ist dann an Sie , wenn Sie wollen begehen diese mit einem gewissen Tag / Label.

Wenn Sie dann alle Nachrichten auf Ihr eigenes GitHub-Repo übertragen möchten, gehen Sie wie immer vor:

git commit -m "Added something by Anonymous"
git push -u origin master

0

Github hat ein klares Dokument zum Zusammenführen der Pull-Anfrage in ein lokales Repo:

https://help.github.com/de/articles/checking-out-pull-requests-locally

Es läuft darauf hinaus zu wissen, dass eine Pull-Anfrage in GitHub nur eine Verzweigung im Basis-Repo ist, wobei der Verzweigungsname eine Sequenznummer ist. Der obige Artikel zeigt Ihnen, wie Sie diese Nummer und die Magie der Git-Befehlszeile finden, um sie mit dem gewünschten Filialnamen in Ihr lokales Repo zu ziehen.

Ich konnte keinen ähnlich einfachen Weg finden, um die Pull-Anfrage in einem Fork zusammenzuführen, den ich auf GitHub erstellt habe.


0

Ich habe diese Lösung für dieses Problem gefunden - Änderungen von nicht zusammengeführter PR auf einem anderen Computer abrufen. Ich habe die folgenden Schritte in Git Bash 1 ausgeführt. Sie müssen den Klon des Remote-Repositorys auf Computer 2 erstellt haben. 2. Führen Sie eine Git-Prüfung durch (Zweig, auf dem PR generiert wurde). 3. Mach Git Pull und fertig !!!!!!!!!!!!!!


0

Dies ist die Lösung aus GitHub-Dokumenten:

Überprüfen Sie in Ihrem Projekt-Repository einen neuen Zweig und testen Sie die Änderungen.

git checkout -b GithubUserID-branchName branchName
git pull https://github.com/GithubUserID/reponame.git branchName

Wo:

  1. GithubUserID ist der Benutzername der Person, die die Pull-Anfrage geöffnet hat.
  2. branchName ist der Name des Zweigs, zum Beispiel Master
  3. reponame Der Repository-Name wie Demo-ToDo

Beispiel:

git checkout -b felix123-master master
git pull https://github.com/felix123/demo-todo.git master
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.