Wie wende ich nicht zusammengeführte Upstream-Pull-Anforderungen von anderen Gabeln auf meine Gabel an?


465

Ein Projekt auf GitHub, von dem ich eine Gabel habe, hat neue Pull-Anforderungen, die ich in meine Gabel ziehen möchte, die der Autor noch nicht eingezogen hat.

Gibt es eine einfache Möglichkeit, eine Pull-Anforderung von anderen Gabeln auf meine Gabel anzuwenden? Gibt es hier noch etwas, das mir fehlt?



Entspricht dies dem Netzwerkdiagramm bei GitHub, wenn Sie dazu git-Befehle verwenden?
ADTC

Könnte auch interessant sein, alle Zweige zu finden: stackoverflow.com/q/47798937/10245
Tim Abell

Antworten:


276

Sie können es ganz einfach manuell machen:

  • Fügen Sie die andere Gabel als Fernbedienung Ihres Repos hinzu:

    git remote add otherfork git://github.com/request-author/project.git
    
  • Holen Sie sich die Commits seines Repos

    git fetch otherfork
    
  • Sie haben dann zwei Möglichkeiten, um die Pull-Anforderung anzuwenden (wenn Sie nicht Auswahl 1 auswählen möchten).

    1. Wenn Sie nicht auch die eventuellen Commits anwenden möchten, die zwischen dem Ursprung und der Pull-Anforderung hinzugefügt wurden, können Sie den Zweig, auf dem die Pull-Anforderung erstellt wurde, einfach neu gründen

      git rebase master otherfork/pullrequest-branch
      
    2. Wenn Sie nur die Commits in der Pull-Anforderung möchten, identifizieren Sie deren SHA1 und tun Sie dies

      git cherry-pick <first-SHA1> <second-SHA1> <etc.>
      

166
Eigentlich sollten Sie Cherry-Pick nicht verwenden, es entstehen neue Commits ... was wiederum Verwirrung stiftet, wenn Sie eine Pull-Anfrage stromaufwärts senden. Stattdessen sollten Sie genau so zusammenführen, wie es die Pull-Anforderung verlangt. Sie müssen auch keine Fernbedienung hinzufügen. git pull URL branchname
Tekkub

3
@Tekkub: stimme zu, es ist möglicherweise besser, Verwechslungen mit neu erstellten Commits zu vermeiden. Das Zusammenführen ist in meinen Augen weniger elegant, da Sie andere Änderungen aus dem Zweig, mit dem Sie zusammenführen,
vornehmen können

8
Ja, aber in diesem Fall fragte er speziell, wie man die Zuganforderung in seine Gabel zieht. Pull == merge.
Tekkub

1
@CharlesB, da GitHub einer Pull-Anfrage automatisch neue Commits für denselben Zweig hinzufügt, wäre es nicht schwierig, "andere Änderungen" zu erhalten (vorausgesetzt, der Anforderer befolgt die Best Practices und legt die Änderungen in einem separaten Zweig von der weiteren Entwicklung ab dass alle Commits relevant sind), es sei denn, Sie möchten nur einen Teil einer Pull-Anfrage?
Neverfox

4
Für diejenigen, die meine mentale Panne teilen, bezieht sich "otherfork" nicht auf das ursprüngliche Repo, sondern auf das Commit von der Gabel, die die Pull-Anforderung an das ursprüngliche Repo ausgegeben hat . Ignorieren Sie das ursprüngliche Repo und gehen Sie direkt zu der Gabel, die die Pull-Anforderung gestellt hat. Sie möchten das Commit, auf das der Pull verweist, manuell abrufen und mit Ihrem eigenen zusammenführen.
Michael Khalili

282

Update: Über Webseite

Sie können dies auch über die Github-Webseite tun.

Ich gehe davon aus, dass Sie bereits eine Fork ( MyFork) des Common Repo ( BaseRepo) haben sollten, die die ausstehende Pull-Anforderung von einer Fork ( OtherFork) enthält, an der Sie interessiert sind.

  1. Navigieren Sie zu der Gabel ( OtherFork), die die Pull-Anforderung initiiert hat, die Sie in Ihre Gabel ( MyFork) erhalten möchten.
  2. Gehen Sie zur Seite mit den Pull-Anforderungen von OtherFork
  3. Klicken Sie auf Neue Pull-Anfrage
  4. Die ausstehenden Pull-Anforderungen sollten angeboten werden. Denken Sie daran, auch den richtigen OtherForkZweig auszuwählen . Wählen Sie auf der linken Seite als Basisgabel Ihre Gabel ( MyFork) ( WICHTIG ).
  5. Jetzt sollte die Option von View pull requestauf ändern Create pull request. Klicke hier.

Jetzt sollten Sie eine ausstehende Pull-Anfrage in Ihrer Fork ( MyFork) haben, die Sie einfach akzeptieren können.


6
Funktioniert wunderbar. Viel einfacher als cmd-Zeile und leicht zu überprüfende Änderungen. Vielen Dank.
Alveoli

3
Ich hatte Probleme zu finden, wie ich zum "OtherFork" auf der Benutzeroberfläche komme. Um einfach dorthin zu gelangen, ändern Sie einfach die URL mit dem Github-Benutzernamen. dh github.com/userName/repoName
Charles

2
Ich konnte die in Schritt 4 erwähnten ausstehenden Pull-Anforderungen nicht sehen. Stattdessen habe ich OtherForkaus der Dropdown-Liste "Vergleichen" auf der rechten Seite den Zweig ausgewählt, der der Pull-Anforderung von entspricht. Ich habe dann die linke Seite als Basisgabel ausgewählt, wie oben beschrieben, um die Pull-Anforderung zu erstellen.
Seddonym

Funktioniert, wenn keine Gabel vorhanden ist. Zum Beispiel: github.com/OculusVR/RakNet/pull/61/files
Milan Babuškov

1
Die genauen Wörter von der Githubs-Site sind möglicherweise veraltet, aber der Prozess ist genau richtig. Super einfach - danke!
Kevnk

73

Wie Tekkub bereits sagte, können Sie den Zweig einfach direkt hineinziehen. Die meiste Zeit mit GitHub ist der Zweig einfach "Master" auf dem Fork des anfragenden Benutzers des Projekts.

Beispiel: git pull https://github.com/USER/PROJECT/ BRANCH

Und als praktisches Beispiel:

Angenommen, Sie haben ein Github-Projekt namens Safaribooks gegabelt, und im ursprünglichen Projekt gibt es die folgende Pull-Anforderung, die Sie in Ihre Gabel einfügen möchten:

Geben Sie hier die Bildbeschreibung ein

Führen Sie dann im geklonten Projektordner Ihrer Gabel Folgendes aus:

git pull https://github.com/fermionic/safaribooks.git fix-str-decode

20
Der Nachteil davon ist, dass der Zweig neben der Pull-Anforderung möglicherweise noch andere Dinge enthält. Außerdem müssen Sie die richtige URL für den Fork des Pull-Request-Autors suchen. Wenn Sie einen Einzeiler verwenden möchten, ist es besser, ihn git pull https://github.com/{upstream/project} refs/pull/{id}/headstattdessen zu verwenden .
Jbyler

1
@jbyler Wenn der Zweig andere Dinge enthält, bin ich mir ziemlich sicher, dass GitHub die Pull-Anfrage trotzdem mit ihnen aktualisiert hat.
Tim Malone

22

Pull-Anforderungen für das Projekt können von vielen verschiedenen Autoren (Gabeln) stammen, und Sie möchten wahrscheinlich nicht für jede Gabel eine separate Fernbedienung. Außerdem möchten Sie keine Annahmen über den Zweig treffen, den der Autor beim Senden der Pull-Anforderung verwendet hat, oder darüber, was sich sonst noch im Hauptzweig des Autors befindet. Es ist daher besser, auf die Pull-Anforderung zu verweisen, wie sie im Upstream-Repository angezeigt wird, als wie sie in den anderen Gabeln angezeigt wird.

Schritt 1:

git remote add upstream <url>

Sie haben diesen Schritt wahrscheinlich bereits ausgeführt, aber wenn nicht, möchten Sie eine für das Upstream-Projekt definierte Fernbedienung. Die URL ist die Klon-URL des Projekts, das Sie gegabelt haben. Weitere Informationen finden Sie unter Konfigurieren einer Fernbedienung für eine Gabel und Synchronisieren einer Gabel . upstreamist der Name, den Sie der Fernbedienung geben, und obwohl es alles sein kann, upstreamist es der herkömmliche Name.

Schritt 2:

git pull upstream refs/pull/{id}/head

... wo {id}ist die Pull-Request-Nummer? upstreamist der Name der Fernbedienung, von der abgerufen werden soll, dh nur "Upstream", wenn Sie Schritt 1 genau befolgt haben. Es kann sich auch um eine URL handeln. In diesem Fall können Sie Schritt 1 überspringen.

Schritt 3:

Geben Sie eine Commit-Nachricht für das Merge-Commit ein. Sie können die Standardeinstellung beibehalten, obwohl ich empfehle, eine schöne einzeilige Zusammenfassung mit der Pull-Anforderungsnummer, dem behobenen Problem und einer kurzen Beschreibung anzugeben:

Merge PR#42, fixing VIM-652, support for mapping arbitrary IDEA actions

Sehen Sie sich auch eine verwandte Antwort mit einer Variante an, die einen lokalen Zweig mit der Pull-Anforderung darin erstellt. Und eine letzte Variante: Sie können verwenden git pull upstream refs/pull/{id}/head, um die Commits in Ihr lokales Repo zu bekommen, und sie dann als FETCH_HEAD(z. B. um git log ..FETCH_HEADzu sehen, was dann drin ist git merge FETCH_HEAD)
jbyler

Wie würde ich vorgehen, damit die Pull-Anforderung an der Spitze steht und ich eine Zusammenführungsblase vermeiden kann?
Michael Johnston

1
Dies war die Lösung, die ich brauchte, weil der Autor der Pull-Anfrage sein Repo entfernt hatte.
Jswetzen

20

Einige detailliertere Informationen, die für mich funktioniert haben.

Meine .git / config-Datei für das gegabelte Repo sieht folgendermaßen aus:

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
        precomposeunicode = false
[remote "origin"]
        url = git@github.com:litzinger/angular-carousel.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master
        rebase = true
[remote "source"]
        url = git://github.com/revolunet/angular-carousel.git
        fetch = +refs/heads/*:refs/remotes/source/*
        fetch = +refs/pull/*/head:refs/remotes/origin/pr/*

Führen Sie dann "git fetch source" aus, in dem alle Pull-Anforderungen aus dem gegabelten Repo aufgelistet sind.

 * [new ref]         refs/pull/54/head -> origin/pr/54
 * [new ref]         refs/pull/67/head -> origin/pr/67
 * [new ref]         refs/pull/69/head -> origin/pr/69
 * [new ref]         refs/pull/71/head -> origin/pr/71

Und um dann in einer bestimmten Pull-Anfrage zusammenzuführen, führen Sie "git merge master origin / pr / 67" aus.


1
Ich habe meine .git / config bearbeitet und die Zeilen [remote "source"] hinzugefügt, aber für das Projekt, an dem ich interessiert war, haben die Anweisungen einwandfrei funktioniert. Ich liebe diese Antwort.
Philo Vivero

3
Ausgezeichnete Ratschläge finden Sie unter news.ycombinator.com/item?id=9051220 und help.github.com/articles/checking-out-pull-requests-locally Hinweise auf diesen (fantastischen) GitHub-spezifischen schreibgeschützten Remote- refs/pull/Namespace .
Philip Durbin

Wenn Sie Smartgit verwenden, können Sie diese Pull-Anforderungen (und die geschlossenen) im Protokolldiagramm sehen, wenn Sie smartgit.branch.otherRefs=notes;pullsmartgit.properties gemäß syntevo.com/doc/display/SG/System+Properties hinzufügen. Sie können sie auch von dort aus zusammenführen .
CAD Kerl

Übrigens können Sie es auch in der Befehlszeile mit git fetch source + refs / Heads / *: refs / remotes / upstream / * + refs / pull / * / head: refs / remotes / origin / pr / *
lib

9

Was ich tun würde, ist das Folgende;

git checkout master
git remote add #NAME# #ADDRESS TO REPO#
git fetch #USERNAME#
git checkout -b test_fork
git rebase #NAME#/#BRANCH#

Ich habe jetzt die Änderungen in einem Testzweig mit dem Namen zusammengeführt test_fork. Damit Änderungen meinen Baum nicht verschmutzen.

Optional können Sie Cherry-Pick wie oben beschrieben verwenden, um ein bestimmtes Commit auszuwählen, wenn dies vorzuziehen ist.

Gute Reise :)


0

Ich benutze dafür ein handliches Dandy-Skript. Ich führe das Skript aus, indem ich Folgendes eingebe:

git prfetch upstream

und es erhält alle Pull-Anforderungen von der Upstream-Gabel.

Um das Skript zu erstellen, erstellen Sie eine Datei ~/bin/git-prfetch.

Die Datei sollte Folgendes enthalten:

#!/bin/bash

if [ -z "$1" ]; then
    echo "Please supply the name of a remote to get pull requests from."
    exit 1
fi

git fetch $1 +refs/heads/\*:refs/remotes/$1/\* +refs/pull/\*/head:refs/remotes/$1/pr/\*

Stellen Sie sicher, dass Ihr Pfad das Skript enthält, indem Sie Folgendes festlegen:

export PATH="$HOME/bin:$PATH"

Sie können diese Datei hinzufügen ~/.bashrc, um die Änderung dauerhaft zu machen.

Stellen Sie nun sicher, dass Sie die Gabelung hinzufügen, von der Sie die Pull-Anforderungen erhalten möchten:

git remote add upstream https://github.com/user/repo.git

Und dann

git prfetch upstream
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.