Comprobación de Git: la actualización de rutas es incompatible con el cambio de ramas

467

Mi problema esta relacionado con error Fatal Git al cambiar de rama .

Intento buscar una rama remota con el comando

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

pero recibo este mensaje de error:

fatal: git checkout: la actualización de rutas es incompatible con el cambio de ramas.
¿Tenía la intención de pagar 'origen / nombre remoto' que no se puede resolver como commit?

Si creo manualmente una rama y luego extraigo la rama remota, funciona, al igual que hacer un nuevo clon y verificar la rama.

¿Por qué no funciona en el repositorio con el que trabajo?

Ikke
fuente
1
¿Qué ha cambiado desde la primera instancia de ese comando (desencadenando el mensaje de error)?
VonC
git init git fetch git fetch git: //blabla.com/dir1/Project.git

Respuestas:

739

Creo que esto ocurre cuando estás tratando de pagar una rama remota que tu repositorio local de git aún no conoce. Tratar:

git remote show origin

Si la rama remota que desea pagar está en "Nuevas ramas remotas" y no en "Ramas remotas rastreadas", primero debe buscarlas:

git remote update
git fetch

Ahora debería funcionar:

git checkout -b local-name origin/remote-name
usuario167628
fuente
77
Esto resolvió el problema para mí, no la respuesta arbitraria anterior.
Jessedc
21
Debe ser "git fetch REPOSITORY_NAME" para obtener todas las ramas en ese repositorio.
Mike Thomsen
1
no necesariamente. git fetchobtendrá todas las ramas de todos los repositorios remotos.
Michael Grinich
44
En caso de que alguien más tenga problemas con la locura de todo esto: git fetch origin / branchname No es lo mismo que git fetch. El primero simplemente da como resultado que se muestre "nuevo (la siguiente búsqueda se almacenará en control remoto / origen)" en una columna visible a través de git remote show origin.
Alexander Kellett el
77
Si está tratando de hacer esto para un control remoto que agregó explícitamente (por lo tanto, cualquier cosa que no sea el origen ) deberá hacerlo git remote updateantes de que su búsqueda recupere ese control remoto. De lo contrario, recibirá mensajes como Did you intend to checkout 'upstream-repo/master' which can not be resolved as commit?Agregue esto a la respuesta y ahorre a las personas horas de leer las mismas respuestas que solo funcionan para el origen.
Bruno Bronosky
150

Sintaxis alternativa,

git fetch origin remote_branch_name:local_branch_name
Placeres raros
fuente
12
Esto funcionó para mí. El nombre de mi sucursal remota no es origen. No sé si eso hace la diferencia ya que he estado bebiendo vodka.
Rimian
13
Esto no es sólo una sintaxis alternativa, pero puede funcionar cuando git checkout -b branch_name origen / branch_name qué no funciona
codercake
1
Esto también solucionó mi problema al ejecutar "git checkout --track origin / remote-branch", que originalmente daba el mismo error que los OP antes de la corrección. ¡Gracias!
kakyo
1
Me funcionó después de ejecutar también la respuesta validada.
AsTeR
2
Sí, sospecho que el --depthcalificador para el clon original puede tener la culpa aquí. Tuve éxito con git fetch remote_branch_name:local_branch_namepero todos los otros consejos fallaron.
John Kelleher
46

Después de haber probado la mayor parte de lo que podía leer en este hilo sin éxito, me topé con este: la rama remota no aparece en "git branch -r"

Resultó que mi archivo .git / config era incorrecto. Después de hacer una solución simple, aparecieron todas las ramas.

Ir desde

[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/*

Hizo el truco

PålOliver
fuente
44
De hecho, esa es una configuración extraña. Le dice a git que solo busque la rama maestra del control remoto.
Ikke
3
¡Lo votaría 10 veces si pudiera! - Esto parece ser algo que el nuevo git hace cuando
clona
2
Tuve el mismo problema, me estaba volviendo loco. Alguien que no vea sucursales remotas, por favor verifique esto
Carlos Granados
Gracias a Dios por tu respuesta :)
Sacha
Mente = soplado! ¡Gracias!
Chiranjib
12

No estoy seguro de si esto es útil o exactamente relevante para su pregunta, pero si está tratando de obtener y pagar solo un solo ramal desde el repositorio remoto, a continuación, los siguientes comandos git hará el truco:

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
VirtualStaticVoid
fuente
11

ninguno de los anteriores funcionó para mí. Mi situación es ligeramente diferente, mi rama remota no está en origen . pero en un repositorio diferente.

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

Consejo: si no ve la rama remota en la siguiente salida, git branch -v -ano hay forma de verificarla.

Confirmado trabajando en 1.7.5.4

Olivier Refalo
fuente
¡Arf, solo date cuenta de que VirtualStaticVoid tenía la misma solución!
Olivier Refalo
+1 para git branch -v -a: Tenía un control remoto configurado incorrectamente que decía fetch = +refs/heads/*:refs/remotes/master/*aunque se llamó al control remoto upstream.
keflavich
7

Para mí lo que funcionó fue:

git fetch

Lo que lleva todas las referencias a su máquina para todas las ramas en el control remoto. Entonces podría hacer

git checkout <branchname>

Y eso funcionó perfectamente. Similar a la respuesta más votada, pero un poco más simple.

Mate
fuente
4

Sospecho que no hay una rama remota llamada nombre-remoto, pero que sin querer ha creado una rama local llamada origen / nombre-remoto.

¿Es posible que en algún momento escribiste:

origen de rama git / nombre remoto

¿Creando así una rama local llamada origen / nombre remoto? Escriba este comando:

origen de pago git / nombre remoto

Verás:

Cambió a la rama "origen / nombre remoto"

lo que significa que es realmente una rama local mal nombrada, o

Nota: pasar a "origen / retrabajo-emisión" que no es una sucursal local
Si desea crear una nueva sucursal a partir de este pago, puede hacerlo
(ahora o más tarde) usando -b con el comando de pago nuevamente. Ejemplo:
  git checkout -b 

lo que significa que realmente es una rama remota.

Don Branson
fuente
3

No es muy intuitivo, pero esto funciona bien para mí ...

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

ENTONCES ejecute el comando git branch --track ...

  git branch --track $BRANCH origin/$BRANCH
Eddie B
fuente
2

Para mí tenía un error tipográfico y mi rama remota no existía

Use git branch -apara enumerar ramas remotas

Thomas
fuente
1

¿Podría su problema estar vinculado a esta otra pregunta SO "problema de pago" ?

es decir: un problema relacionado con:

  • una versión antigua de Git
  • una curiosa sintaxis de pago, que debería ser:, git checkout -b [<new_branch>] [<start_point>]con [<start_point>]referencia al nombre de una confirmación en la que iniciar la nueva rama, y 'origin/remote-name'no es eso.
    (mientras git branchque admite un punto_inicial siendo el nombre de una rama remota)

Nota: lo que dice el script checkout.sh es:

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

Es como si la sintaxis git checkout -b [] [remote_branch_name] cambiara el nombre de la rama y restableciera el nuevo punto de inicio de la nueva rama, que se considera incompatible.

VonC
fuente
El problema esta resuelto. git checkout -b-nombre local remoto / mando a distancia-rama funciona realmente
Zona no
1
Interesante, ¿qué ha cambiado desde la primera instancia de ese comando (desencadenando el mensaje de error)?
VonC
1

Después de buscar un millón de veces, todavía no se mostraban controles remotos agregados, aunque los blobs estaban en el grupo. Resulta que la opción --tags no se debe dar agit remote add por cualquier razón. Puede eliminarlo manualmente de .git / config para que git fetch cree las referencias.

eMPee584
fuente