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.