Github: importa il ramo upstream nel fork


169

Ho un fork ( origin) da un progetto ( upstream) su github. Ora il progetto a monte ha aggiunto un nuovo ramo, voglio importare nel mio fork. Come lo faccio?

Ho provato a controllare il telecomando e creare un ramo in più, ma questo configura il ramo nel modo in cui git pushsta cercando di spingere verso upstream:

git checkout upstream/branch
git checkout -b branch

modificare

Forse non era chiaro, ma voglio aggiungere il ramo al mio repository locale, quindi posso spingerlo su origin(il mio fork) tramite git push. Perché i repository a monte sono in genere di sola lettura e tu li bifondi per contribuire.

Quindi, fondamentalmente, voglio controllare un ramo inesistente sul origincui contenuto verrà estratto upstream.

Risposte:


262
  1. Assicurati di aver inserito il nuovo ramo a monte nel tuo repository locale :

    • Innanzitutto, assicurati che l'albero di lavoro sia pulito (esegui il commit / stash / annulla eventuali modifiche)
    • Quindi, git fetch upstreamper recuperare il nuovo ramo a monte
  2. Crea e passa a una versione locale del nuovo ramo upstream ( newbranch):

    • git checkout -b newbranch upstream/newbranch
  3. Quando sei pronto a spingere il nuovo ramo verso l' origine :

    • git push -u origin newbranch

L' opzione -u imposta il tracciamento sul telecomando specificato (in questo esempio origin)


6
Credo che git fetch upstreamè una scelta migliore al primo passo, dal momento che git pull upstreamrichiede più azioni da fare dopo git remote add ...per il upstream.
Alexander Pavlov,

git pull ritorni a monte: l' You asked to pull from the remote 'upstream', but did not specify a branch. Because this is not the default configured remote for your current branch, you must specify a branch on the command line.aggiunta del nome del ramo alla fine del comando provoca un'unione tra il ramo nel monte a monte con il ramo locale corrente invece di consentire la creazione di un nuovo ramo locale. Qualche idea?
mMontu,

1
Sostituendo git pull upstreamcon git fetch upstreamrisolto il problema, i seguenti passaggi hanno funzionato.
lunedì

Ottengo: fatale: impossibile aggiornare i percorsi e passare al ramo "upstream" allo stesso tempo. Hai intenzione di fare il checkout 'upstream / master' che non può essere risolto come commit?
sureshvv,

1
@sureshvv Probabilmente è perché è necessario disporre di un riferimento remoto al repository upstream denominato upstream prima di eseguire qualsiasi operazione. In caso contrario, è così che ne aggiungi uno: git remote add upstream your_git_upstream_repository_url.git . Leggi questo se hai bisogno di chiarimenti in merito.
Gabriel Rainha,

7

io userei

git checkout -b <new_branch> upstream/<new_branch>

Questo è in realtà quello che ho provato anche prima di quello che ho spiegato nella domanda; porta agli stessi risultati.
colpire il

4

Ho avuto anche problemi con questo e google mi ha portato qui. Le soluzioni non hanno funzionato comunque. Il mio problema era che quando ho aggiunto il mio upstream, ha impostato la mia configurazione git per recuperare solo master, piuttosto che tutti i rami. ad esempio sembrava così

[remote "somebody"]
        url = git@github.com:somebodys/repo.git
        fetch = +refs/heads/master:refs/remotes/upstream/master

La modifica di .git / config come segue ha risolto il mio problema

[remote "somebody"]
        url = git@github.com:somebodys/repo.git
        fetch = +refs/heads/*:refs/remotes/upstream/*

1

I seguenti passaggi hanno funzionato bene per me (supponendo che il nome del ramo a monte sia branch):

$ git fetch upstream
$ git checkout branch
$ git push origin

1
Ottengo git fetch fatale a monte: 'upstream' non sembra essere un repository git fatale: impossibile leggere dal repository remoto. Assicurarsi di disporre dei diritti di accesso corretti e che il repository esista.
ThinkDigital,

0

--track?

git branch --track branch upstream/branch

Forse ti ho capito male, ma farlo imposterà il ramo allo stesso modo; con la pushtentazione di upstream.
colpire il

No, penso di averti frainteso.
troelskn,

0

Ho avuto uno scenario leggermente più complicato in cui avevo già upstreamdefinito uno nel mio fork (dal repository canonico) ma dovevo controllare un ramo da un fork diverso. Per farlo, il processo è leggermente diverso. Ecco la configurazione con cui sono finito:

[remote "origin"]
url = git@github.com:<your_user/org>/<repo>.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
rebase = true
[remote "upstream"]
url = git@github.com:<upstream_user>/<repo>.git
fetch = +refs/heads/*:refs/remotes/upstream/*
[remote "other_user"]
url = git@github.com:<other_user>/<repo>.git
fetch = +refs/heads/*:refs/remotes/<other_user>/*

Ora puoi anche controllare un ramo dalla <other_user>forcella.

git fetch <other_user> <branch>
git checkout -b <branch> <other_user>/<branch>

Ciò ti darà un ramo locale derivato dal fork.

Per spingere quel ramo locale dovevo essere specifico con il mio comando push.

git push origin <branch>

È praticamente la stessa della risposta accettata, solo che il telecomando da cui stai recuperando non si chiama "upstream".
colpì il
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.