Git checkout: l'aggiornamento dei percorsi non è compatibile con il cambio di filiali


467

Il mio problema è legato all'errore Fatal Git quando si cambia ramo .

Provo a recuperare un ramo remoto con il comando

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

ma ricevo questo messaggio di errore:

fatal: checkout git: l'aggiornamento dei percorsi non è compatibile con la commutazione dei rami.
Intendi effettuare il checkout di "origine / nome remoto" che non può essere risolto come commit?

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

Perché non funziona sul repository con cui lavoro?


1
cosa è cambiato dalla prima istanza di quel comando (innescando il messaggio di errore)?
VonC,

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

Risposte:


739

Credo che ciò si verifichi quando stai provando a fare il checkout di un ramo remoto di cui il tuo repository git locale non è ancora a conoscenza. Provare:

git remote show origin

Se il ramo remoto che vuoi verificare è in "Nuovi rami remoti" e non "Rami remoti monitorati", devi prima recuperarli:

git remote update
git fetch

Ora dovrebbe funzionare:

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

7
Ciò 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.
Mike Thomsen,

1
non necessariamente. git fetchotterrà tutti i rami da tutti i repository remoti.
Michael Grinich,

4
Nel caso in cui qualcun altro lotta con la totale follia di tutto ciò: git fetch origin / branchname Non è lo stesso di git fetch. Il primo si traduce semplicemente in "nuovo (il prossimo recupero verrà memorizzato in telecomandi / origine)" visualizzato in una colonna visibile tramite git show show origin.
Alexander Kellett,

7
Se stai provando a farlo per un telecomando che hai aggiunto esplicitamente (quindi qualsiasi cosa diversa da origine ) dovrai farlo git remote updateprima che il tuo recupero lo recuperi. Altrimenti ricevi messaggi come Did you intend to checkout 'upstream-repo/master' which can not be resolved as commit?Per favore aggiungi questo alla risposta e risparmia ore alle persone di leggere le stesse risposte che funzionano solo per l'origine.
Bruno Bronosky,

150

Sintassi alternativa,

git fetch origin remote_branch_name:local_branch_name

12
Questo ha funzionato per me. Il mio nome di filiale remota non è origine. Non so se questo faccia la differenza perché ho bevuto vodka.
Rimian,

13
Questa non è solo una sintassi alternativa, ma può funzionare quando git checkout -b nome_ramo origine / nome_ ramo non funziona
codercake

1
Ciò ha anche risolto il mio problema durante l'esecuzione di "git checkout --track origin / remote-branch", che originariamente forniva lo stesso errore degli OP prima della correzione. Grazie!
Kakyo,

1
Ha funzionato per me dopo aver eseguito anche la risposta convalidata.
AsTeR,

2
Sì, sospetto che il --depthqualificatore per il clone originale possa essere in errore qui. Ho avuto successo, git fetch remote_branch_name:local_branch_namema tutti gli altri consigli sono falliti.
John Kelleher,

46

Dopo aver provato la maggior parte di ciò che potevo leggere in questo thread senza successo, mi sono imbattuto in questo: Branch remoto non visualizzato in "git branch -r"

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

Andando da

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

per

[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 principale dal telecomando.
Ikke,

3
Vorrei votare 10 volte se potessi! - questa sembra essere una cosa che fa un nuovo git durante la clonazione
mpapis,

2
Ho avuto lo stesso problema, mi stava facendo impazzire. Chi non vede filiali remote, controlla questo !!
Carlos Granados,

Grazie a Dio per la tua risposta :)
Sacha,

Mente = soffiato! Grazie!
Chiranjib,

12

Non sono sicuro che ciò sia utile o esattamente pertinente alla tua domanda, ma se stai cercando di recuperare e estrarre solo un singolo ramo dal repository remoto, i seguenti comandi git faranno 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

nessuna delle precedenti ha funzionato per me. La mia situazione è leggermente diversa, il mio ramo remoto non è all'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 vedi il ramo remoto nel seguente output git branch -v -anon c'è modo di verificarlo.

Confermato il lavoro su 1.7.5.4


arf, appena realizzato VirtualStaticVoid aveva la stessa soluzione!
Olivier Refalo,

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

7

Per me ciò che ha funzionato è stato:

git fetch

Il che tira giù tutti i ref sulla tua macchina per tutti i rami sul telecomando. Allora potrei fare

git checkout <branchname>

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


4

Ho il sospetto che non vi sia alcun ramo remoto chiamato nome remoto, ma che tu abbia inavvertitamente creato un ramo locale chiamato origine / nome remoto.

È possibile che a un certo punto sia stato digitato:

git branch origine / nome-remoto

Quindi creando un ramo locale chiamato origin / remote-name? Digita questo comando:

git checkout origin / nome-remoto

O vedrai:

Passato al ramo "origine / nome remoto"

il che significa che è davvero un ramo locale mal chiamato, o

Nota: passare a "origin / rework-isscoring" che non è una filiale locale
Se vuoi creare una nuova filiale da questo checkout, puoi farlo
(ora o più tardi) usando nuovamente -b con il comando checkout. Esempio:
  git checkout -b 

il che significa che è davvero un ramo remoto.


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        

POI esegui il comando git branch --track ...

  git branch --track $BRANCH origin/$BRANCH

2

Per me ho avuto un refuso e il mio ramo remoto non esisteva

Utilizzare git branch -aper elencare i rami remoti


1

Il problema potrebbe essere collegato a questa altra domanda SO "problema alla cassa" ?

cioè: un problema relativo a:

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

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

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

È come se la sintassi git checkout -b [] [remote_branch_name] stesse rinominando il ramo e reimpostando il nuovo punto iniziale del nuovo ramo, che è ritenuto incompatibile.


Il problema è risolto. git checkout -b remote / remote-branch di nome locale in realtà funziona
Ikke

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

1

Dopo aver recuperato un milione di volte, i telecomandi aggiunti non venivano ancora visualizzati, anche se i BLOB erano in piscina. Si scopre che l' opzione --tags non dovrebbe essere data per nessun git remote addmotivo. Puoi rimuoverlo manualmente da .git / config per fare in modo che git fetch crei i ref.

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.