Git estrae un certo ramo da GitHub


631

Ho un progetto con più rami. Li sto spingendo su GitHub , e ora che qualcun altro sta lavorando al progetto, devo estrarre i loro rami da GitHub. Funziona bene in master. Ma dire che qualcuno ha creato un ramo xyz. Come posso tirare il ramoxyz da GitHub e unirlo nel xyzmio ramo localhost?

In realtà ho la mia risposta qui: spingere e tirare i rami in Git

Ma ricevo un errore "! [Rifiutato]" e qualcosa su "avanzamento non veloce".

Eventuali suggerimenti?


3
qual è il vero comando che stai eseguendo?
Alex N.

1
È un recupero che può fallire con il messaggio "non veloce". Hai modificato il ramo di tracciamento remoto (origin / xyz) o il ramo è stato riavvolto / riscritto nel repository remoto? Potrebbe essere necessario utilizzare " git fetch origin --force", ma leggere la documentazione prima di farlo.
Jakub Narębski,

Risposte:


758

Ma ricevo un errore "! [Rifiutato]" e qualcosa su "avanzamento non veloce"

Questo perché Git non può unire le modifiche dai rami al tuo attuale master. Supponiamo che tu abbia verificato il ramo mastere desideri unirti al ramo remoto other-branch. Quando lo fai:

$ git pull origin other-branch

Git sta praticamente facendo questo:

$ git fetch origin other-branch && git merge other-branch

Cioè, a pullè solo a fetchseguito da a merge. Tuttavia, quando pull-ing, Git si unirà solo other-branch se può eseguire una fusione in avanti veloce . Un fast-forward merge è un'unione in cui il capo del ramo si sta tentando di fondersi in un diretto discendente del capo del ramo si desidera unire. Ad esempio, se si dispone di questo albero della cronologia, la fusione other-branchcomporterebbe una fusione rapida:

O-O-O-O-O-O
^         ^
master    other-branch

Tuttavia, questa non sarebbe un'unione di avanzamento rapido:

    v master
O-O-O
\
 \-O-O-O-O
         ^ other-branch

Per risolvere il tuo problema, prima scarica il ramo remoto:

$ git fetch origin other-branch

Quindi uniscilo nel tuo ramo corrente (suppongo che sia master) e correggi eventuali conflitti di unione:

$ git merge origin/other-branch
# Fix merge conflicts, if they occur
# Add merge conflict fixes
$ git commit    # And commit the merge!

No, il problema è con il recupero, non con il passaggio di unione.
Jakub Narębski,

3
Normalmente, i telecomandi sono impostati in modo tale che i recuperi siano forzati, anche se non comportano un commit ad avanzamento rapido, quindi non dovrebbe verificarsi sul recupero a meno che l'OP non abbia cambiato qualcosa con la solita configurazione. Il problema di avanzamento rapido può verificarsi durante il recupero o l' unione. Cosa ti fa dire che il problema è sicuramente nel recupero e non nella fusione?
mipadi,

Seguo questi passaggi (recupero, unione). Git mi dice che non c'è niente da fare. Quando provo a impegnarmi, cade su gemiti per l'avanzamento veloce.
Jean Jordaan,

1
@mipadi Ho avuto lo stesso problema di Jean e, anche se non posso dire che il telecomando sia configurato nel modo non predefinito che hai menzionato, posso dire che l'utilizzo git fetch -fha risolto il mio problema! Grazie!
Cregox,

1
Ciò unisce la filiale remota alla filiale xzylocale master, che non è ciò che era implicito dalla domanda originale; "Come posso estrarre il ramo xyz da GitHub e unirlo nel ramo xyz sul mio host locale?"
user5359531

302

Tieni traccia dei tuoi rami remoti in modo esplicito e un semplice git pullfarà esattamente quello che vuoi:

git branch -f remote_branch_name origin/remote_branch_name
git checkout remote_branch_name

Quest'ultima è un'operazione locale.

O ancora di più in linea con la documentazione GitHub sul fork :

git branch -f new_local_branch_name upstream/remote_branch_name

40
Se ottieni 'Non un nome oggetto valido:' origin / remote_branch_name ', esegui prima' git fetch origin '.
Martin Konicek,

131

È possibile estrarre un ramo da un ramo con i seguenti comandi.

git pull {repo} {remotebranchname}:{localbranchname}

git pull origin xyz:xyz

Quando sei nel ramo principale, puoi anche prima verificare un ramo come:

git checkout -b xyz

Questo crea un nuovo ramo, "xyz", dal master e lo verifica direttamente.

Quindi fai:

git pull origin xyz

Ciò tira il nuovo ramo sul xyzramo locale .


1
Perfetto! Non sapevo proprio quella sintassi: git pull {repo} {remotebranchname}: {localbranchname}. Domanda, se quel pull non funziona (forse qualcuno ha aggiornato il ramo e ci sarebbero conflitti di unione) quali sono le mie opzioni?
Costa

7
Sto effettuando il downvoting di questo perché tenta di unire il ramo remoto nel ramo corrente (ad es. Master). Questo non è ciò che la maggior parte delle persone vuole fare e non è ciò che l'OP ha richiesto. La risposta di @mohit è la scelta corretta.
Phrogz,

1
Phrogz: sembra che questo comportamento sia cambiato nelle ultime versioni di Git. L'ho usato prima e ha funzionato perfettamente.
Pawan,

89

Il modo migliore è:

git checkout -b <new_branch> <remote repo name>/<new_branch>

1
Dopo aver creato un nuovo ramo "dev" su github, e provando quanto sopra, ho ricevuto il seguente messaggio di errore: "fatale: origin / dev non è un commit e un ramo 'dev' non può essere creato da esso" La soluzione era "git recuperare "secondo la soluzione di Bradley Flood di seguito, quindi rieseguire la risposta di Mohit.
TomEberhard,

46

git fetch prenderà l'ultimo elenco di filiali.

Ora puoi git checkout MyNewBranch

Fatto :)


Per maggiori informazioni vedi documenti: git fetch


37

Non sono sicuro di aver compreso appieno il problema, ma tirare un ramo esistente è fatto in questo modo (almeno funziona per me :)

git pull origin BRANCH

Ciò presuppone che la filiale locale sia stata creata al di fuori dell'origine / FILIALE.


15

Questo mi ha aiutato a ottenere il ramo remoto prima di unirlo in altro:

git fetch repo xyz:xyz
git checkout xyz

8

In poche parole, se vuoi estrarre da GitHub il ramo the_branch_I_want:

git fetch origin
git branch -f the_branch_I_want origin/the_branch_I_want
git checkout the_branch_I_want

3
git pull <gitreponame> <branchname>

Di solito se hai assegnato solo un repository al tuo codice, gitreponame sarebbe originario.

Se stai lavorando su due repository come uno locale e un altro per remoto come puoi controllare l'elenco dei repository da git remote -v . questo mostra quanti repository sono assegnati al tuo codice attuale.

BranchName dovrebbe esistere nel corrispondente gitreponame.

è possibile utilizzare i seguenti due comandi per aggiungere o rimuovere repository

git remote add <gitreponame> <repourl>
git remote remove <gitreponame>

2

puoi anche farlo

git pull -r origin master

correggere eventuali conflitti di unione

git rebase --continue

-r è per rebase. Questo ti renderà la struttura del ramo da

        v  master       
o-o-o-o-o
     \o-o-o
          ^ other branch

per

        v  master       
o-o-o-o-o-o-o-o
              ^ other branch

Ciò porterà a una storia più pulita. Nota: nel caso in cui tu abbia già spinto il tuo altro ramo verso l'origine (o qualsiasi altro telecomando), potresti dover forzare il push del tuo ramo dopo il rebase.

git push -f origin other-branch

1

L'ho fatto

git branch -f new_local_branch_name origin/remote_branch_name

Invece di

git branch -f new_local_branch_name upstream/remote_branch_name

Come suggerito da @innaM. Quando ho usato la versione upstream, diceva 'fatal: non un nome oggetto valido:' upstream / remote_branch_name ''. Non ho fatto git fetch origincome suggerito da un commento, ma semplicemente sostituito upstreamcon origin. Immagino che siano equivalenti.


0

per estrarre il ramo da GitHub puoi usare

git checkout --track origin/the-branch-name

Assicurarsi che il nome del ramo sia esattamente lo stesso.

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.