Come controllo un ramo Git remoto?


6714

Qualcuno ha spinto un ramo chiamato testcon git push origin testun repository condiviso. Riesco a vedere il ramo con git branch -r.

Ora sto provando a controllare il testramo remoto .

Ho provato:

  • git checkout test che non fa nulla

  • git checkout origin/test* (no branch). Il che è confuso. Come posso essere su "nessuna filiale"?

Come controllo un ramo Git remoto?


9
@inger Ma non include la possibilità di rinominare il nuovo ramo locale (se si desidera --set-upstream in seguito e mantenere la coerenza dei nomi)
fachexot

15
Penso che questo thread non sia utile. Nulla sembra funzionare, la domanda originale sembra essersi persa in molte delle risposte. Ho letto ogni parola, provato tutto sotto e non ho idea di come fare ciò che l'OP vuole fare.
Tony Ennis,

6
I comandi Git non sono intuitivi per cominciare, aggiungi le modifiche introdotte con le versioni recenti al mix e hai questa pagina ...
Christophe Roussy,

14
Mi sento come se stessi prendendo pillole pazze. Sto provando a fare il checkout di un ramo da un upstream, non solo origin, e ogni risposta consigliata non fa nulla di remotamente utile (giochi di parole). EDIT - mi scusi, la moltitudine di suggerimenti contenuti nelle prime 2 risposte erano inutili; Il terzo ( git branch test origin/test) è ciò che funziona. Sono contento che i primi 2 abbiano 20 volte il numero di voti ...
dwanderson

4
Forse hai un file chiamato 'test' nella tua struttura di lavoro, vedi stackoverflow.com/a/45006389/792416 per i dettagli.
Oldman,

Risposte:


9151

Aggiornare

La risposta di Jakub in realtà migliora su questo. Con le versioni Git ≥ 1.6.6, con un solo telecomando, puoi semplicemente fare:

git fetch
git checkout test

Come sottolinea l'utente Masukomi in un commento, git checkout testNON funzionerà con git moderno se si dispone di più telecomandi. In questo caso utilizzare

git checkout -b test <name of remote>/test

o la stenografia

git checkout -t <name of remote>/test

Vecchia risposta

Prima di poter iniziare a lavorare localmente su una filiale remota, è necessario recuperarlo come indicato nelle risposte di seguito.

Per recuperare un ramo, devi semplicemente:

git fetch origin

Questo recupererà tutti i rami remoti per te. Puoi vedere le filiali disponibili per il checkout con:

git branch -v -a

Con le filiali remote in mano, ora è necessario controllare la filiale che ti interessa, dandoti una copia di lavoro locale:

git checkout -b test origin/test

398
Per espandere questo: git non ti consente di lavorare sui rami di qualcun altro. Puoi lavorare solo da solo. Quindi, se si desidera aggiungere al ramo di qualcun altro, è necessario creare la propria "copia" di quel ramo, che è ciò che fa il comando sopra (beh, crea il ramo e lo verifica anche).
Dan Molding,

139
Se si tratta di un nuovo ramo remoto, potresti doverlo fare git fetchprima di farlo in modo che Git sia a conoscenzaorigin/test
Neil Sarkar,

56
... e lo faresti congit fetch origin test
Andrew

22
Errore: "checkout git: l'aggiornamento dei percorsi non è compatibile con il cambio di rami. Intendi effettuare il checkout origin/testche non può essere risolto come commit?"
Xeoncross,

85
git checkout testNON funzionerà con git moderno se hai più telecomandi con lo stesso nome di filiale . Non può sapere quale usare.
Masukomi,

1256

Sidenote: con Git moderno (> = 1.6.6 ), puoi usare solo

git checkout test

(nota che è 'test' non 'origin / test') eseguire magiche DWIM -mery e creare il ramo locale 'test' per te, per il quale a monte sarebbe il ramo di tracciamento remoto 'origin / test'.


La * (no branch)in git branchmezzi di uscita che sono sul ramo senza nome, nel cosiddetto stato "HEAD singola" (punti HEAD direttamente a commettere, e non è simbolico come base un ramo locale). Se hai effettuato alcuni commit su questo ramo senza nome, puoi sempre creare un ramo locale dal commit corrente:

git checkout -b test HEAD

** EDIT (per editore non autore) **

Ho trovato un commento sepolto di seguito che sembra modernizzare questa risposta:

@Dennis: git checkout, ad esempio git checkout origine / risultati del test in HEAD / ramo senza nome distaccato, mentre git checkout test o git checkout -b test origine / risultati del test nel ramo locale test (con origine / test ramo di localizzazione remota come upstream ) - Jakub Narębski il 9 gennaio 14 alle 8:17

enfasi su git checkout origin/test


33
Non sorprende, ma questa versione è stata rilasciata negli ultimi anni: sapere che questa sintassi può far risparmiare molto tempo poiché ci sono ancora molti vecchi documenti e thread di commenti che suggeriscono il metodo più vecchio per farlo.
Curtis,

10
"modern git" - per la cronaca, (circa) a quale versione ti riferisci? A volte dobbiamo lavorare su sistemi che eseguono distribuzioni precedenti.
Craig McQueen,

5
"git moderno" in questo contesto è git 1.6.6
Bobby Norton

10
@aidan Se ricevi una risposta del genere error: pathspec 'branch_name' did not match any file(s) known to git., dovresti prima fare un prelievo.
Dennis,

6
Usando la versione 1.8.3.msysgit.0 di git e questo non funziona per me - non corrisponde ad alcun file noto a git - ho fatto molti
recuperi

565

In questo caso, probabilmente si desidera creare un testramo locale che sta monitorando il testramo remoto :

$ git branch test origin/test

Nelle versioni precedenti di git, era necessaria --trackun'opzione esplicita , ma questa è l'impostazione predefinita ora quando si dirama un ramo remoto.


15
Questo creerà un ramo locale senza passare ad esso.
Alex Skrypnyk,

2
Anche se sono diventato fatale: Nome oggetto ambiguo: 'origin / dev' - dove esiste sicuramente un ramo 'dev' sull'origine - ma avevo accidentalmente creato un ramo chiamato "origin / dev" sulla mia macchina (nei miei stupidi tentativi precedenti per farlo bene, senza dubbio) ... ahi
PandaWood il

1
Questo mi ha dato l'errore: non è riuscito a spingere alcuni riferimenti per suggerire: gli aggiornamenti sono stati respinti perché un suggerimento di ramo spinto è dietro il suo suggerimento remoto: controparte. Dai un'occhiata a questo ramo e unisci il suggerimento sulle modifiche remote: (es. 'Git pull') prima di spingere di nuovo. suggerimento: vedere la "Nota sull'avanzamento rapido" in "git push --help" per i dettagli.
pal4life,

475

La risposta accettata non funziona per te?

Mentre la prima e la risposta selezionata è tecnicamente corretta , esiste la possibilità di non aver ancora recuperato tutti gli oggetti e i riferimenti dal repository remoto. In tal caso, riceverai il seguente errore:

$ git checkout -b remote_branch origin/remote_branch

fatal: checkout git: l'aggiornamento dei percorsi non è compatibile con la commutazione dei rami.
Hai intenzione di fare il checkout 'origin / remote_branch' che non può essere risolto come commit?

Soluzione

Se ricevi questo messaggio, devi prima fare un git fetch origindove originè il nome del repository remoto prima dell'esecuzione git checkout remote_branch. Ecco un esempio completo con le risposte:

$ git fetch origin
remote: Counting objects: 140, done.
remote: Compressing objects: 100% (30/30), done.
remote: Total 69 (delta 36), reused 66 (delta 33)
Unpacking objects: 100% (69/69), done.
From https://github.com/githubuser/repo-name
   e6ef1e0..5029161  develop    -> origin/develop
 * [new branch]      demo       -> origin/demo
   d80f8d7..359eab0  master     -> origin/master

$ git checkout demo
Branch demo set up to track remote branch demo from origin.
Switched to a new branch 'demo'

Come puoi vedere, l'esecuzione ha git fetch originrecuperato tutti i rami remoti che non eravamo ancora configurati per tracciare sul nostro computer locale. Da lì, poiché ora abbiamo un riferimento alla filiale remota, possiamo semplicemente eseguire git checkout remote_branche otterremo i vantaggi del monitoraggio remoto.


2
Aggiungerò una nota se hai un ramo separato localmente: assicurati di averlo associato al repository remoto usando 'git remote add origin [the_path_to_your_repo / repo_name.git]'. Quindi usa 'git fetch origin' dove 'origin' indica il repository di origine con cui hai creato l'associazione.
elliotrock,

git checkout -b newbranchfunziona anche alla grande per la creazione e il checkout in 1 passaggio di un nuovo ramo basato sul ramo corrente.
Linus,

2
Penso che questo sia il più aggiornato (fa cambiare $ @ #! Ing!). Git 2.5.5 Ho trovato che l'unico modo per vedere effettivamente i rami remoti era git ls-remotee l'unico modo per usarne effettivamente uno è git checkout -b [branch] --track [remote/branch]... e dopo ha git pull [remote] [branch] funzionato. Cioè, in realtà ha tirato l'intero ramo, ma ancora non lo elenca.
delicateLatticework

e quando neanche questa risposta funziona, vedi questa .
Eis,

solo per aggiungere, se tu git fetch other_remote only_branch, ricevi ancora l' fatalerrore. Devi git fetch other_remotesenza il nome del ramo. Design strano.
est

258

Ho provato la soluzione sopra, ma non ha funzionato. Prova questo, funziona:

git fetch origin 'remote_branch':'local_branch_name'

Questo recupererà il ramo remoto e creerà un nuovo ramo locale (se non esiste già) con nome local_branch_namee seguirà quello remoto in esso.


37
Questo ha funzionato per me quando né git fetch origin né git remote update hanno creato filiali locali. Non sono sicuro del perché.
Godsmith,

4
Questo era il modo più diretto per ottenere ciò di cui avevo bisogno, ovvero usare un ramo remoto (non master) per creare un nuovo ramo.
Roralee,

7
Ha funzionato senza problemi, soprattutto dopo aver clonato un singolo ramo da un telecomando con più rami.
Alex C

7
questo ha funzionato anche per me, dove le risposte accettate e le altre votazioni alte non lo hanno fatto. La mia versione git è 2.5.0
pdepmcp,

5
Qualcuno ha idea del perché questo funziona quando tutto il resto no? (I'm on git 2.13.0)
Nathan Arthur

108

Questo sarà DWIM per un'origine remota non denominata ( documentazione ):

$ git checkout -t remote_name/remote_branch

Per aggiungere un nuovo telecomando, devi prima effettuare le seguenti operazioni:

$ git remote add remote_name location_of_remote
$ git fetch remote_name

Il primo dice a Git che esiste il telecomando, il secondo ottiene i commit.


104

Uso:

git checkout -b <BRANCH-NAME> <REMOTE-NAME>/<BRANCH-NAME>

Altre risposte non funzionano con Git moderno nel mio caso benigno. Potrebbe essere necessario estrarre prima se il ramo remoto è nuovo, ma non ho verificato quel caso.


2
Ti rendi conto che questo è un estratto di questa risposta
Thomas Ayoub,

14
Guardandolo ora, si sovrappongono. Solo il mio è succinto e ti dice cosa fare piuttosto che raccontare una storia. Presumo che possa essere più utile quindi, soprattutto per le versioni git di oggi. Puoi ridimensionarlo se pensi che sia una cattiva risposta.
matanster,

1
git fetch è l'opzione sicura. Prova a recuperare prima di utilizzare pull. Entrambi scaricano contenuti remoti, ma mentre il recupero non cambia lo stato locale, pull cambia immediatamente lo stato locale.
Peter Szalay,

89

ok , la risposta è semplice ... In pratica vedi la filiale, ma non hai ancora una copia locale! ...

Hai bisogno fetchdel ramo ...

Puoi semplicemente recuperare e quindi effettuare il checkout al ramo, utilizzare il comando a una riga di seguito per farlo:

git fetch && git checkout test

Ho anche creato l'immagine qui sotto per condividere le differenze, guardare come fetchfunziona e anche come è diverso da pull:

git fetch


@DmitriZaitsev sì, funzionerà, se il ramo remoto è lì e fai il recupero, otterrai il ramo localmente ... git fetch && git checkout test..Quindi funziona, a meno che non ci sia ramo remoto, ma il domanda dicendo che c'è già un ramo remoto lì ...
Alireza

Il modo in cui vedo la domanda testsembra un nuovo ramo, quindi non è probabile che sia presente localmente. Altrimenti potresti tirarlo più facilmente con un singolo git pullcomando.
Dmitri Zaitsev,

@DmitriZaitsev, sì, è per questo che ho detto git fetch, che verifica la presenza di rami remoti appena creati, pull può portare altri oggetti indesiderati, ma fetch rende disponibili tutti i rami se hai già il repository localmente ...
Alireza

Non sarebbe fetch, senza pullmodifiche congedo nella copia inverosimile, ma non nella filiale locale, che porta alla vostra filiale locale non essere up-to-date?
Dmitri Zaitsev,

56

Per clonare un repository Git, eseguire:

git clone <either ssh url /http url>

Il comando sopra verifica tutti i rami, ma masterverrà inizializzato solo il ramo. Se vuoi controllare gli altri rami, fai:

git checkout -t origin/future_branch (for example)

Questo comando verifica il ramo remoto e il nome del ramo locale sarà lo stesso del ramo remoto.

Se desideri sostituire il nome della tua filiale locale al momento del pagamento:

git checkout -t -b enhancement origin/future_branch

Ora il nome della tua filiale locale è enhancement, ma lo è il nome della tua filiale remota future_branch.

Documentazione


git clone <ssh url / http url> - funziona perfettamente per me
Kmeixner,

Sì hai ragione. Grazie per la tua informazione, lo aggiornerò molto presto @warvariuc
Madhan Ayyasamy

Se il telecomando non ha master, questo non funzionerà.
polkovnikov.ph,

36

Puoi provare

git fetch remote
git checkout --track -b local_branch_name origin/branch_name

o

git fetch
git checkout -b local_branch_name origin/branch_name

2
Cordiali saluti, --tracknon è più necessario nelle versioni più recenti di git, perché è impostato di default, come spiegato in questa risposta precedente .

33

Innanzitutto, devi fare:

git fetch # Se non conosci il nome della filiale

git fetch origin branch_name

In secondo luogo, puoi controllare la filiale remota nel tuo locale:

git checkout -b branch_name origin/branch_name

-b creerà un nuovo ramo nel nome specificato dal ramo remoto selezionato.


Non capisco -b. Se riesci a fare "git checkout master" perché non puoi fare "git checkout origin / test"?
John Little,

-b per la nuova filiale che proviene da origine / maestro
Mohideen bin Mohammed

28

Uso il seguente comando:

git checkout --track origin/other_remote_branch

13
Questa risposta sarebbe molto più utile se spieghi perché la stai usando in questo modo. cioè perché qualcuno dovrebbe usare '--track' e così via ...
Matt Friedman il

27

comandi

git fetch --all
git checkout -b <ur_new_local_branch_name> origin/<Remote_Branch_Name>

sono uguali a

 git fetch --all

e poi

 git checkout -b fixes_for_dev origin/development

Entrambi creeranno un latest fixes_for_devdadevelopment


24

Se il ramo si trova su qualcosa di diverso dal origintelecomando, mi piace fare quanto segue:

$ git fetch
$ git checkout -b second/next upstream/next

Questo verificherà il nextramo sul upstreamtelecomando in un ramo locale chiamato second/next. Ciò significa che se si dispone già di una filiale locale denominata next, non sarà in conflitto.

$ git branch -a
* second/next
  remotes/origin/next
  remotes/upstream/next


18

nessuna di queste risposte ha funzionato per me. questo ha funzionato:

git checkout -b feature/branch remotes/origin/feature/branch


1
Grazie. Mi chiedevo se dovevo usare il percorso completo ( telecomandi / origine / funzione / ramo ) che ho visto gitquando ho chiamato il git branch -acomando, ma non ero sicuro, quindi ho usato git checkout -b apps/FEATURE/branch origin/apps/FEATURE/branche sembrava funzionare. Messaggio:Branch 'apps/FEATURE/branch' set up to track remote branch 'apps/FEATURE/epicBranch' from 'origin'. Switched to a new branch 'apps/FEATURE/branch'
Chris22,

18

Ero bloccato in una situazione a error: pathspec 'desired-branch' did not match any file(s) known to git.causa di tutti i suggerimenti di cui sopra. Sono su git versione 1.8.3.1.

Quindi questo ha funzionato per me :

git fetch origin desired-branch
git checkout -b desired-branch FETCH_HEAD

La spiegazione dietro è che ho notato che durante il recupero del ramo remoto, è stato portato a FETCH_HEAD:

$ git fetch origin desired-branch
From github.com:MYTEAM/my-repo
    * branch            desired-branch -> FETCH_HEAD

17

Basta eseguire git checkoutcon il nome del ramo remoto. Git creerà automaticamente un ramo locale che traccia quello remoto:

git fetch
git checkout test

Tuttavia, se il nome di quel ramo viene trovato in più di un telecomando, questo non funzionerà poiché Git non sa quale usare. In tal caso puoi usare:

git checkout --track origin/test

o

git checkout -b test origin/test

In 2.19 , Git ha appreso la checkout.defaultRemoteconfigurazione, che specifica un telecomando predefinito in caso di risoluzione di tale ambiguità.


16

git branch -rdice che il nome dell'oggetto non è valido, perché il nome di quel ramo non è nella lista dei rami locale di Git. Aggiorna l'elenco delle filiali locali dall'origine con:

git remote update

E quindi prova a controllare di nuovo il tuo ramo remoto.

Questo ha funzionato per me.

Credo che git fetchattiri tutti i rami remoti, che non è quello che voleva il poster originale.


2
Cordiali saluti, git remote update prenderà anche tutti i rami remoti .

13

Il git remote show <origin name>comando elencherà tutti i rami (compresi i rami non tracciati). Quindi puoi trovare il nome del ramo remoto che devi recuperare.

Esempio:

$ git remote show origin

Utilizzare questi passaggi per recuperare i rami remoti:

git fetch <origin name> <remote branch name>:<local branch name>
git checkout <local branch name > (local branch name should the name that you given fetching)

Esempio:

$ git fetch origin test:test
$ git checkout test

@hallski ha risposto non funzionando con le versioni 2.15.1 ma ho ridotto il file .git clonando solo 1 ramo e la cronologia dei filtri con --depth flag. ad esempio, non si $ git clone -b release --single-branch --depth 5 https://github.com/user/repo.gittratta di informazioni $ git remote show originche non elencano tutti i rami remoti con repository clonati a ramo singolo.
Qh0stM4N

10

Recupera dal telecomando e verifica il ramo.

git fetch <remote_name> && git checkout <branch_name> 

Per esempio:

git fetch origin && git checkout feature / XYZ-1234-Aggiungi-avvisi


9

Altri ragazzi e ragazze danno le soluzioni, ma forse posso dirti perché.

git test di verifica che non fa nulla

Does nothing non è uguale doesn't work , quindi immagino che quando digiti 'git checkout test' nel tuo terminale e premi il tasto Invio, non appare alcun messaggio e non si verifica alcun errore. Ho ragione?

Se la risposta è "sì", posso dirti la causa.

La causa è che c'è un file (o cartella) chiamato 'test' nella tua struttura di lavoro.

Quando git checkout xxxanalizzato,

  1. Inizialmente Git considera il xxxnome di un ramo, ma non esiste alcun ramo chiamato test.
  2. Quindi Git pensa che xxxsia un percorso e fortunatamente (o sfortunatamente), esiste un file chiamato test. Quindi git checkout xxxsignifica scartare qualsiasi modifica nel xxxfile.
  3. Se non è presente neanche un file xxx, Git proverà a creare il file in xxxbase ad alcune regole. Una delle regole è creare un ramo chiamato xxxse remotes/origin/xxxesiste.

grazie, continuavo a cercare di capire perché Git non stesse facendo nulla.
Mike R,

8

Per ottenere filiali appena create

git fetch

Per passare a un altro ramo

git checkout BranchName

6

Puoi iniziare a tracciare tutti i rami remoti con il seguente script Bash:

#!/bin/bash
git fetch --all
for branch in `git branch -r --format="%(refname:short)" | sed 's/origin\///'`
  do git branch -f --track "$branch" "origin/$branch"
done

Ecco anche una versione a linea singola:

git fetch --all; for branch in `git branch -r --format="%(refname:short)" | sed 's/origin\///'`; do git branch --track "$branch" "origin/$branch" ; done ;

5

git checkout -b "Branch_name" [B significa Crea ramo locale]

ramo git - tutti

git checkout -b "Il nome della tua filiale"

ramo git

checkout riuscito dal ramo master al ramo dev

inserisci qui la descrizione dell'immagine


git checkout -b "Branch_name" [B significa Crea ramo locale]
Keshav Gera

3

per ottenere tutti i rami remoti usa questo:

git fetch --all

quindi vai alla filiale:

git checkout test

2

Utilizzare fetchper estrarre tutto il telecomando

   git fetch --all

Per elencare le filiali remote:

   git branch -r

Per elencare tutti i tuoi rami

   git branch -l
   >>outpots like-
     * develop
       test
       master

Per effettuare il checkout / modificare un ramo

   git checkout master

Ho provato git branch -le non è stato mostrato alcun ramo remoto.
Dmitri Zaitsev il

usare git pull --allogit fetch --all
Nasir Khan il

Sì, e successivamente git branch -l mostra ancora solo le filiali locali . Sembra funzionare esattamente come git branchsenza -l, quindi qual è la ragione -l?
Dmitri Zaitsev l'

Inoltre la tua risposta non risponde alla domanda - masternon è un ramo remoto.
Dmitri Zaitsev l'

1
-lflag per elenco. Puoi --listanche usare
Nasir Khan il

2

Per noi, sembra che la remote.origin.fetchconfigurazione abbia dato un problema. Pertanto, non abbiamo potuto vedere altri rami remoti di master, quindi git fetch [--all]non ha aiutato. Né git checkout mybranchgit checkout -b mybranch --track origin/mybranchha funzionato, anche se sicuramente era a distanza.

È stato masterpossibile recuperare solo la configurazione precedente :

$ git config --list | grep fetch
remote.origin.fetch=+refs/heads/master:refs/remotes/origin/master

Risolvilo utilizzando *e recupera le nuove informazioni dall'origine:

$ git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'

$ git fetch
...
 * [new branch] ...
...

Ora potremmo git checkoutlocalizzare la filiale remota.

Non ho idea di come sia finita questa configurazione nel nostro repository locale.


1
Questo mi ha risolto da quando ho clonato un singolo ramo
Pontus Holmbom il

2

Se il nome del ramo remoto inizia con caratteri speciali, devi usare virgolette singole attorno al comando di checkout, altrimenti git non saprà di quale ramo stai parlando.

Ad esempio, ho provato a fare il checkout di un ramo remoto chiamato come #9773ma il comando non ha funzionato correttamente, come mostrato nell'immagine seguente:

inserisci qui la descrizione dell'immagine

Per qualche motivo mi chiedevo se il simbolo affilato (#) potesse avere qualcosa a che fare con esso, e poi ho provato a circondare il nome del ramo con virgolette singole, come '#9773'rathen che solo #9773, e fortunatamente ha funzionato bene.

$ git checkout -b '#9773' origin/'#9773'

In molte shell unix il #carattere viene utilizzato per i commenti, quindi qualsiasi cosa dopo la #verrà ignorata. Questa è una cosa shell e non qualcosa di specifico per Git. Usare le virgolette di una barra rovesciata prima di #dovrebbe essere sufficiente.
Paulo Scardine,

1

Seguire il comando per creare una cartella vuota. Immettere quello e utilizzare questo comando:

saifurs-Mini:YO-iOS saifurrahman$ git clone your_project_url
Cloning into 'iPhoneV1'...
remote: Counting objects: 34230, done.
remote: Compressing objects: 100% (24028/24028), done.
remote: Total 34230 (delta 22212), reused 15340 (delta 9324)
Receiving objects: 100% (34230/34230), 202.53 MiB | 294.00 KiB/s, done.
Resolving deltas: 100% (22212/22212), done.
Checking connectivity... done.
saifurs-Mini:YO-iOS saifurrahman$ cd iPhoneV1/
saifurs-Mini:iPhoneV1 saifurrahman$ git checkout 1_4_0_content_discovery
Branch 1_4_0_content_discovery set up to track remote branch 1_4_0_content_discovery from origin.
Switched to a new branch '1_4_0_content_discovery'
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.