2009-06-03 8 views
447

Il mio problema è relativo a Fatal Git error when switching branch.Checkout Git: i percorsi di aggiornamento non sono compatibili con i rami di commutazione

provo a prendere un ramo remoto con il comando

git checkout -b local-name origin/remote-name 

ma ottengo questo messaggio di errore:

fatale: git checkout: aggiornamento traiettorie è incompatibile con la commutazione rami.
Hai intenzione di eseguire il checkout di "origine/nome remoto" che non può essere risolto come commit?

Se creo manualmente un ramo e quindi il ramo remoto, funziona, proprio come fare un nuovo clone e controllare il ramo.

Perché non funziona nel repository con cui lavoro?

+1

cosa è cambiato dalla prima istanza di quel comando (attivando il messaggio di errore)? – VonC

+0

git init git fetch git fetch git: //blabla.com/dir1/Project.git –

risposta

721

Credo che questo si verifichi quando si tenta di eseguire il checkout di un ramo remoto che il repository git locale non è ancora a conoscenza. Prova:

git remote show origin 

Se il ramo remoto da cassa è in fase di "Nuove filiali remote" e non "filiali remote cingolati" allora avete bisogno di prenderli prima:

git remote update 
git fetch 

Ora dovrebbe funzionare :

git checkout -b local-name origin/remote-name 
+6

Questo ha risolto il problema per me, non la risposta arbitraria di cui sopra. – Jessedc

+21

Dovrebbe essere "git fetch REPOSITORY_NAME" per ottenere tutti i rami su quel repository. –

+1

non necessariamente. 'git fetch' otterrà tutti i rami da tutti i repository remoti. –

1

Il problema potrebbe essere collegato a questa altra domanda SO "checkout problem"?

cioè: un problema relativo a:

  • una vecchia versione di Git
  • una sintassi cassa curiosa, che dovrebbe essere: git checkout -b [<new_branch>] [<start_point>], con [<start_point>] riferimento al nome di un commit in cui iniziare la nuovo ramo e 'origin/remote-name' non è quello.
    (mentre git branch supporta uno start_point è il nome di una filiale remota)

Nota: ciò che il checkout.sh script dice è:

if test '' != "$newbranch$force$merge" 
    then 
    die "git checkout: updating paths is incompatible with switching branches/forcing$hint" 
    fi 

E 'come la cassa sintassi git -b [] [ remote_branch_name] stava entrambi rinominando il ramo e reimpostando il nuovo punto di partenza del nuovo ramo, che è ritenuto incompatibile.

+0

Il problema è risolto. git checkout -b nome-locale remoto/ramo remoto funziona davvero – Ikke

+1

Interessante, cosa è cambiato dalla prima istanza di quel comando (attivando il messaggio di errore)? – VonC

144

sintassi alternativa,

git fetch origin remote_branch_name:local_branch_name 
+12

Questo ha funzionato per me. Il mio nome di filiale remota non è di origine. Non so se questo faccia la differenza visto che ho bevuto la vodka. – Rimian

+12

Questa non è solo una sintassi alternativa, ma può funzionare quando git checkout -b nome_arigine origine/nome_società non funziona – codercake

+0

omg! FNX! mi hai salvato da un mal di testa! git aggiornamento remoto && git fetch non ha funzionato per me - non ha visto altri rami .. –

3

Sospetto che non ci sia un ramo remoto denominato nome-remoto, ma che tu abbia inavvertitamente creato un ramo locale di nome origine/nome-remoto.

E 'possibile ad un certo punto scelto:

 
git branch origin/remote-name 

Creando così un ramo locale di nome origine/remote-name? Digitare il seguente comando:

 
git checkout origin/remote-name 

potrete sia vedere:

 
Switched to branch "origin/remote-name" 

che significa che è davvero una filiale locale mis-denominata o

 
Note: moving to "origin/rework-isscoring" which isn't a local branch 
If you want to create a new branch from this checkout, you may do so 
(now or later) by using -b with the checkout command again. Example: 
    git checkout -b 

che significa che è in realtà un telecomando ramo.

12

Non sono sicuro se questo è utile o esattamente corrispondente alla tua domanda, ma se si sta cercando di recuperare e nella verifica una sola ramo dal repository remoto, quindi i seguenti comandi git farà il trucco:

url= << URL TO REPOSITORY >> 
branch= << BRANCH NAME >> 

git init 
git remote add origin $url 
git fetch origin $branch:origin/$branch 
git checkout -b $branch --track origin/$branch 
11

nessuno dei precedenti ha funzionato per me. La mia situazione è leggermente diversa, la mia filiale remota non è a origine. ma in un repository diverso.

git remote add remoterepo GIT_URL.git 
git fetch remoterepo 
git checkout -b branchname remoterepo/branchname 

suggerimento: se non si vede il ramo remoto nel seguente output git branch -v -a non c'è modo di check it out.

confermato a lavorare su 1.7.5.4

+0

arf, renditi conto che VirtualStaticVoid ha la stessa soluzione! –

+0

+1 per 'git branch -v -a': Avevo un telecomando configurato in modo errato che diceva' fetch = + refs/heads/*: refs/remotes/master/* 'anche se il remoto era chiamato' upstream'. – keflavich

+0

Funziona, grazie – wukong

3

Non è molto intuitivo, ma questo funziona bene per me ...

mkdir remote.git & cd remote.git & git init 
    git remote add origin $REPO 
    git fetch origin $BRANCH:refs/remotes/origin/$BRANCH   

quindi eseguire il comando git branch --track ...

git branch --track $BRANCH origin/$BRANCH 
7

Per me ciò che ha funzionato è stato:

git fetch 

Che scarica tutti gli arbitri sulla macchina per tutti i rami su remoto. Quindi potrei fare

git checkout <branchname> 

e che ha funzionato perfettamente. Simile alla risposta votata in alto, ma un po 'più semplice.

1

Dopo aver recuperato un milione di volte i telecomandi aggiunti non sono stati visualizzati, anche se i BLOB erano nella piscina. Risulta che l'opzione --tags non deve essere data a git remote add per qualsiasi motivo. Puoi rimuoverlo manualmente da .git/config per fare git fetch creare i refs.

41

Dopo aver provato la maggior parte di quello che ho potuto leggere in questa discussione senza successo, ci siamo imbattuti in questo: Remote branch not showing up in "git branch -r"

Si è scoperto che il mio file .git/config non era corretto. Dopo aver fatto una semplice correzione, tutti i rami si sono presentati.

Andando da

[remote "origin"] 
    url = http://stash.server.com/scm/EX/project.git 
    fetch = +refs/heads/master:refs/remotes/origin/master 

a

[remote "origin"] 
    url = http://stash.server.com/scm/EX/project.git 
    fetch = +refs/heads/*:refs/remotes/origin/* 

ha fatto il trucco

+4

Questa è davvero una configurazione strana. Indica a git di recuperare solo il ramo master dal telecomando. – Ikke

+3

Lo voterei 10 volte se potessi! - Questa sembra essere una cosa che fa il nuovo git quando clona lo – mpapis

+2

Ho avuto lo stesso problema, mi stava facendo impazzire. Chiunque non veda le filiali remote, per favore controlla questo !! –

0

Per quanto mi riguarda ho avuto un errore di battitura e la mia filiale remota non esistessi

Usa git branch -a elencare filiali remote