Come applicare richieste di pull upstream non combinate da altre forcelle nel mio fork?


466

Un progetto su GitHub di cui ho un fork ha una nuova richiesta pull che voglio inserire nel mio fork che l'autore non ha ancora inserito.

Esiste un modo semplice per applicare la mia richiesta pull da altre forche nella mia forcella? C'è qualcos'altro qui che mi manca?



Questo si riflette sul grafico di rete su GitHub se usi i comandi git per farlo?
ADTC

Potrebbe anche essere interessante trovare tutti i rami: stackoverflow.com/q/47798937/10245
Tim Abell

Risposte:


276

Puoi farlo manualmente abbastanza facilmente:

  • aggiungi l'altro fork come telecomando del tuo repository:

    git remote add otherfork git://github.com/request-author/project.git
    
  • recupera gli impegni del suo repository

    git fetch otherfork
    
  • Hai quindi due opzioni per applicare la richiesta pull (se non vuoi scegliere scegli 1.)

    1. Se non ti interessa applicare anche gli eventuali commit che sono stati aggiunti tra l'origine e la richiesta pull, puoi semplicemente rifare il ramo su cui è stata formata la richiesta pull

      git rebase master otherfork/pullrequest-branch
      
    2. Se vuoi solo i commit nella richiesta pull, identifica il loro SHA1 ed esegui

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

166
In realtà, non dovresti usare cherry-pick, crea nuovi commit ... che a loro volta causeranno confusione se invii una richiesta pull a monte. Invece dovresti unirti proprio come la richiesta pull sta chiedendo di fare. Non è nemmeno necessario aggiungere un telecomando. git pull URL branchname
Tekkub,

3
@Tekkub: d'accordo, potrebbe essere meglio evitare confusione con i commit appena creati. L'unione è meno elegante nella mia mente poiché puoi apportare altre modifiche dal ramo con cui ti stai unendo
CharlesB,

8
Sì, ma in questo caso ha chiesto specificamente come inserire la richiesta di pull nella sua forcella. Pull == unisci.
Tekkub,

1
@CharlesB, poiché GitHub aggiunge automaticamente nuovi commit sullo stesso ramo a una richiesta pull, non sarebbe difficile ottenere "altre modifiche" (supponendo che il richiedente segua le migliori pratiche e metta le modifiche su un ramo separato dallo sviluppo continuo, quindi che tutti i commit sono rilevanti), a meno che ciò che stai ottenendo sia quando vuoi solo parte di una richiesta pull?
Neverfox,

4
Per coloro che condividono il mio problema tecnico, "otherfork" non fa riferimento al repository originale, ma fa riferimento al commit dal fork che ha inviato la richiesta pull al repository originale. Ignora il repository originale e vai direttamente alla forcella che ha effettuato la richiesta di pull. Desideri estrarre manualmente il commit a cui faceva riferimento pull e unirlo con il tuo.
Michael Khalili,

282

Aggiornamento: tramite pagina Web

Puoi anche farlo tramite la pagina web di github.

Presumo, dovresti avere già un fork ( MyFork) del repository comune ( BaseRepo) che ha la richiesta pull in sospeso da un fork ( OtherFork) a cui sei interessato.

  1. Passa al fork ( OtherFork) che ha avviato la richiesta pull che desideri inserire nel fork ( MyFork)
  2. Vai alla pagina delle richieste pull di OtherFork
  3. Fai clic su nuova richiesta pull
  4. Dovrebbero essere offerte le richieste pull in sospeso. Ricorda di selezionare anche il OtherForkramo appropriato . Selezionare sul lato sinistro come forcella base la forcella ( MyFork) ( IMPORTANTE ).
  5. Ora l'opzione di View pull requestdovrebbe cambiare in Create pull request. Clicca qui

Ora dovresti avere una richiesta pull in sospeso nella tua forcella ( MyFork), che puoi semplicemente accettare.


6
Funziona magnificamente. Molto più semplice della linea cmd e facile da rivedere le modifiche. Grazie.
Alveoli,

3
Ho avuto difficoltà a trovare come raggiungere "OtherFork" sull'interfaccia utente. Per arrivarci facilmente basta modificare l'URL con il nome utente github. cioè github.com/userName/repoName
Charles

2
Non sono stato in grado di vedere le richieste di pull in sospeso menzionate nel passaggio 4. Al contrario, ho selezionato il ramo corrispondente alla richiesta di pull effettuata da OtherFork, dal menu a discesa "confronta" a destra. Ho quindi selezionato il lato sinistro come forcella base come descritto sopra per creare la richiesta pull.
seddonimo,

Funziona a meno che non ci sia fork. Ad esempio: github.com/OculusVR/RakNet/pull/61/files
Milan Babuškov

1
Le parole esatte dal sito githubs potrebbero non essere aggiornate, ma il processo è perfetto. Super semplice - grazie!
kevnk

73

Come detto in precedenza Tekkub, puoi semplicemente tirare direttamente il ramo. Il più delle volte con GitHub, il ramo è semplicemente "master" sul fork dell'utente del progetto richiedente.

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

E come esempio pratico:

Supponiamo che tu abbia biforcuto un progetto github chiamato safaribooks e che ci sia la seguente richiesta pull, nel progetto di origine, che vuoi mettere nel fork:

inserisci qui la descrizione dell'immagine

Quindi, nella cartella del progetto clonato del fork, eseguire:

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

20
L'aspetto negativo di questo è che il ramo potrebbe contenere altre cose oltre alla richiesta pull. Inoltre, devi cercare l'URL corretto per il fork dell'autore della richiesta pull. Se vuoi usare un one-liner, meglio usare git pull https://github.com/{upstream/project} refs/pull/{id}/headinvece.
jbyler,

1
@jbyler Se la succursale contiene altre cose, sono abbastanza sicuro che GitHub avrà comunque aggiornato la richiesta pull con loro.
Tim Malone,

22

Le richieste pull per il progetto possono provenire da molti autori (forchette) diversi e probabilmente non si desidera un telecomando separato per ogni fork. Inoltre, non si desidera formulare ipotesi sul ramo utilizzato dall'autore durante l'invio della richiesta pull o su cos'altro potrebbe trovarsi nel ramo principale dell'autore. Quindi è meglio fare riferimento alla richiesta pull come appare nel repository upstream, piuttosto che come appare nelle altre fork.

Passo 1:

git remote add upstream <url>

Probabilmente hai già fatto questo passaggio, ma in caso contrario, vorrai un telecomando definito per il progetto a monte. L'URL è l'URL del clone del progetto che hai biforcato. Maggiori informazioni su Configurazione di un telecomando per un fork e sincronizzazione di un fork . upstreamè il nome che stai dando al telecomando, e mentre può essere qualsiasi cosa, upstreamè il nome convenzionale.

Passo 2:

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

... dov'è {id}il numero di richiesta pull. upstreamè il nome del telecomando da cui estrarre, ovvero solo "upstream" se hai seguito esattamente il passaggio 1. Può anche essere un URL, nel qual caso puoi saltare il passaggio 1.

Passaggio 3:

Digitare un messaggio di commit per il commit di merge. Puoi mantenere il valore predefinito, anche se ti consiglio di fornire un riassunto di una riga con il numero della richiesta pull, il problema risolto e una breve descrizione:

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

Vedi anche una risposta correlata con una variante che crea un ramo locale con la richiesta pull in esso. E un'ultima variante: puoi usare git pull upstream refs/pull/{id}/headper ottenere i commit nel tuo repository locale, quindi fai riferimento a loro FETCH_HEAD(ad esempio git log ..FETCH_HEADper vedere cosa c'è dentro, quindi git merge FETCH_HEAD)
jbyler,

come farei per il rebasing, quindi la richiesta pull è alla testa e posso evitare una bolla di unione?
Michael Johnston,

1
Questa era la soluzione di cui avevo bisogno, perché l'autore della richiesta pull aveva rimosso il suo repository.
jswetzen, il

20

Alcune informazioni più dettagliate che hanno funzionato per me.

Il mio file .git / config per il repository biforcato è simile al seguente:

[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/*

Quindi eseguire "git fetch source", che elenca quindi tutte le richieste pull dal repository biforcato.

 * [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

E poi per unire in una richiesta pull specifica eseguire "git merge master origin / pr / 67"


1
Ho modificato il mio .git / config e aggiunto le righe [remote "sorgente"] ma per il progetto a cui ero interessato e le istruzioni hanno funzionato perfettamente. Adoro questa risposta.
philo vivero,

3
Ottimi consigli correlati sono disponibili su news.ycombinator.com/item?id=9051220 e help.github.com/articles/checking-out-pull-requests- suggerimenti locali a questo (fantastico) refs/pull/spazio dei nomi remoto di sola lettura specifico di GitHub .
Philip Durbin,

Se usi Smartgit puoi vedere queste richieste pull (e quelle chiuse) nel grafico del registro se aggiungi smartgit.branch.otherRefs=notes;pulla smartgit.properties secondo syntevo.com/doc/display/SG/System+Properties - puoi anche unirle da lì .
Bloke CAD

a proposito, puoi anche provarlo dalla riga di comando con git fetch source + refs / heads / *: refs / remotes / upstream / * + refs / pull / * / head: refs / remotes / origin / pr / *
lib

9

Quello che vorrei fare è il seguente;

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

Ora ho unito le modifiche in un ramo di prova, chiamato test_fork. In modo che eventuali modifiche non sporchino il mio albero.

Opzionalmente puoi usare cherry-pick come descritto sopra per scegliere un commit particolare se è più preferibile.

Buon viaggio :)


0

Per questo uso una comoda sceneggiatura dandy. Eseguo lo script digitando:

git prfetch upstream

e ottiene tutte le richieste pull dal fork upstream.

Per creare lo script crea un file ~/bin/git-prfetch.

Il file dovrebbe contenere quanto segue:

#!/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/\*

Assicurati che il tuo percorso includa lo script impostando:

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

È possibile aggiungere questo file ~/.bashrcper rendere permanente la modifica.

Ora assicurati di aggiungere il fork da cui desideri ottenere le richieste pull:

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

E poi

git prfetch upstream
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.