Su configuración especifica fusionarse con el <nombre de la sucursal> desde el control remoto, pero no se obtuvo dicha referencia.

202

Recibo este error para pull:

Su configuración especifica fusionarse con la referencia 'refs / heads / feature / Sprint4 / ABC-123-Branch' desde el control remoto, pero no se obtuvo dicha referencia.

Este error no viene para ninguna otra rama.
Lo especial de esta rama es que se crea a partir de la confirmación previa de otra rama.

Mi archivo de configuración se ve así:

[core]
    repositoryformatversion = 0
    filemode = false
    bare = false
    logallrefupdates = true
    symlinks = false
    ignorecase = true
    hideDotFiles = dotGitOnly
[remote "origin"]
    url = <url here>
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "new-develop"]
    remote = origin
    merge = refs/heads/new-develop
[branch "feature/Sprint4/ABC-123-Branch"]
    remote = origin
    merge = refs/heads/feature/Sprint4/ABC-123-Branch
Farrukh Chishti
fuente
¿Puedes compartir el comando que estás usando para hacer la fusión?
dchayka
1
Este problema puede ocurrir cuando se ha eliminado la rama remota. Verifique si realmente está allí.
Benny Neugebauer
44
Lectores futuros: si sabe que la rama remota existe, verifique si está ignorando el caso o no. Había configurado una sucursal local para rastrear una sucursal remota, pero escribí el nombre del control remoto en minúsculas. Solo tenía que reconfigurar local para rastrear el origen / Nombre de la sucursal en lugar del origen / nombre de la sucursal
Jerreck
Acabo de tener este error y el problema era mucho más simple que las respuestas a continuación, había perdido mi conexión VPN. Este también es el error que obtienes si git no puede acceder al servidor de origen remoto.
Ben Thurley
Mi servidor git estaba fuera. Esa es la causa.
dellasavia

Respuestas:

147

Lo que esto significa

Su corriente arriba, el control remoto al que llama, originya no tiene, o tal vez nunca tuvo (es imposible distinguir solo con esta información) una rama llamadafeature/Sprint4/ABC-123-Branch . Hay una razón particularmente común para eso: alguien (probablemente no tú, o lo recordarías) eliminó la rama en ese otro repositorio de Git.

Qué hacer

Esto depende de lo que quieras . Vea la sección de discusión a continuación. Usted puede:

  • crear o volver a crear la rama en el control remoto, o
  • eliminar su sucursal local, o
  • cualquier otra cosa que se te ocurra.

Discusión

Debe estar ejecutándose git pull(si estuviera ejecutando git merge, obtendría un mensaje de error diferente o ningún mensaje de error).

Cuando ejecuta git fetch, su Git contacta a otro Git, según la urllínea que se encuentra debajo de la [remote "origin"]sección de su configuración. Ese Git ejecuta un comando ( upload-pack) que, entre otras cosas, envía a su Git una lista de todas las ramas. Puedes usar git ls-remotepara ver cómo funciona esto (pruébalo, es educativo). Aquí hay un fragmento de lo que obtengo al ejecutar esto en un repositorio Git para gitsí mismo:

$ git ls-remote origin
From [url]
bbc61680168542cf6fd3ae637bde395c73b76f0f    HEAD
60115f54bda3a127ed3cc8ffc6ab6c771cbceb1b    refs/heads/maint
bbc61680168542cf6fd3ae637bde395c73b76f0f    refs/heads/master
5ace31314f460db9aef2f1e2e1bd58016b1541f1    refs/heads/next
9e085c5399f8c1883cc8cdf175b107a4959d8fa6    refs/heads/pu
dd9985bd6dca5602cb461c4b4987466fa2f31638    refs/heads/todo
[snip]

Las refs/heads/entradas enumeran todas las ramas que existen en el control remoto, 1 junto con los ID de confirmación correspondientes (pararefs/tags/ entradas, las ID pueden apuntar a etiquetar objetos en lugar de confirmaciones).

Su Git toma cada uno de estos nombres de rama y lo cambia de acuerdo con la fetch(s) línea (s) en esa misma remotesección. En este caso, su Git reemplaza refs/heads/masterconrefs/remotes/origin/master , por ejemplo. Su Git hace esto con cada nombre de sucursal que aparece.

También registra los nombres originales en el archivo especial FETCH_HEAD(puede ver este archivo si mira en su propio .gitdirectorio). Este archivo guarda los nombres e ID obtenidos.

El git pullcomando se entiende como un atajo conveniente: se ejecuta git fetchen el control remoto apropiado y luego git merge(o, si se le indica git rebase) , con los argumentos necesarios para fusionar (o rebase) como lo indica la [branch ...]sección. En este caso, su [branch "feature/Sprint4/ABC-123-Branch"]sección dice buscar origin, luego fusionar con cualquier ID que se encuentre bajo el nombre refs/heads/feature/Sprint4/ABC-123-Branch.

Como no se encontró nada con ese nombre, se git pullqueja y se detiene.

Si ejecutó esto como dos pasos separados, git fetchy luego git merge(o git rebase), su Git miraría sus remotes/origin/ramas de seguimiento remoto en caché para ver en qué fusionarse o rebase. Si no era como una rama de una sola vez, es posible que tenga la rama remota de seguimiento. En este caso, no recibirá un mensaje de error. Si nunca hubo una rama de este tipo, o si se ha ejecutado git fetchcon --prune(lo que elimina las ramas muertas de seguimiento remoto), de modo que no tiene una rama de seguimiento remoto correspondiente, recibirá una queja, pero se referirá a ella en su origin/feature/Sprint4/ABC-123-Branchlugar.

En cualquier caso , podemos concluir que feature/Sprint4/ABC-123-Branchno existe ahora en el control remoto nombrado origin.

Probablemente existió en algún momento, y probablemente creó su sucursal local desde la sucursal de seguimiento remoto. Si es así, probablemente todavía tenga la rama de seguimiento remoto. Puede investigar para ver quién eliminó la rama del control remoto y por qué, o simplemente puede presionar algo para volver a crearla o eliminar su rama de seguimiento remoto y / o su rama local.


1 Bueno, todo lo que va a admitir , al menos. Pero a menos que hayan ocultado específicamente algunas referencias, la lista incluye todo.

torek
fuente
Gracias por explicar qué hace realmente el comando git pull. Pude solucionar mi problema ejecutando git fetch y luego fusionar.
fizch
11
Para eliminar referencias de rama remotas inexistentes en su repositorio local, usegit remote prune origin
Yoav
1
@ Ben-Uri: sí, o, carrera git fetch --prune origin, o el conjunto fetch.prunede trueen la configuración (los tres están destinados a hacer lo mismo, aunque en algunas versiones de Git algunos de estos no eran muy fiables).
torek
1
Necesitarías git checkout <your remote branch>y todo sería bueno (en algunos casos).
Alexander Shtang el
2
@ JonathanBenn: puede usar git branch --set-upstream-to=origin/master masterpara cambiar la configuración aguas arriba de su local master. Eliminar y recrear tiene eso como un efecto secundario (suponiendo que use el estilo DWIM git checkout masterpara crearlo), con un efecto secundario adicional de obligarlo mastera que coincida con su estilo origin/master.
torek
71

Esto también puede suceder si usted / alguien cambió el nombre de la sucursal. Entonces, siga estos pasos (si sabe que el nombre de la sucursal cambia de nombre) Asumiendo el nombre de la sucursal anterior como wrong-branch-namey alguien lo renombró a correct-branch-nameSo.

git checkout correct-branch-name

git pull (verá esto "Su configuración especifica ..")

git branch --unset-upstream

git push --set-upstream origin correct-branch-name

git pull (no recibirá el mensaje anterior)

Extremo
fuente
1
Ni siquiera es necesario git pushy no funcionará si la rama actual está detrás de su control remoto. git pull origin correct-branch-namees suficiente.
Pierre
1
El comando para configurar upstream es incorrecto arriba. Haga un git pull después de la operación --unset-upstream, en la salida del pull puede ver un error, con el comando para configurar el upstream, como a continuación, git branch --set-upstream-to = origin / <branch > mybranch
Ankit Marothi
Me funcionó muy bien después de eliminar algunos archivos grandes de mi repositorio y necesitaba retroceder a un nuevo repositorio que acabo de crear
larrytech
40

Compruebe si su rama remota está disponible para extraer. Tuve el mismo problema, finalmente me di cuenta de que alguien eliminó la rama remota.

Malhaar Punjabi
fuente
44
¡Fue lo mismo para mi!
Aerin
3
Después de una solicitud de extracción, la fusión (es decir, la persona que hizo la fusión) tiene la opción de eliminar la rama que se fusionó en la rama de destino. Si intenta tirar en ese punto, obtendrá este error.
Artokun
eso es cierto :)
Malhaar Punjabi
7

Para mí fue un problema de mayúsculas y minúsculas. Mi sucursal local era Version_feature2 en lugar de Version_Feature2. Volví a revisar mi rama con la carcasa correcta y luego git pull funcionó.

nicko
fuente
2
Esto resultó ser mi problema también. No es necesariamente obvio con nombres de rama bastante largos / complicados.
Håkon K. Olafsen
6

Este error también se puede recibir cuando el nombre de la sucursal de origen tiene algún problema de caso.

Por ejemplo: la rama de origen es team1-Teamy la rama local ha sido pagada como team1-team. Entonces, esto Tadentro -Teamy tadentro -teampuede causar tal error. Esto sucedió en mi caso. Entonces, al cambiar el nombre local con el nombre de la rama de origen, se resolvió el error.

akgupta
fuente
6

En mi caso, simplemente carecía de confirmación inicial en la rama remota, por lo que la rama local no encontraba nada que extraer y estaba dando ese mensaje de error.

Yo hice:

git commit -m 'first commit' // on remote branch
git pull // on local branch
Nicola Gallazzi
fuente
4

Recibí un error similar cuando la causa real era que mi disco estaba lleno. Después de eliminar algunos archivos, git pullcomenzó a funcionar como esperaba.

usuario1747134
fuente
4

Seguí encontrándome con este problema. En mi caso, el comentario de @ Jerreck sobre las diferencias de casos en los nombres de las ramas fue la causa de este error. Algunas herramientas de Windows no son conscientes de mayúsculas y minúsculas.

Para desactivar mayúsculas y minúsculas en git, ejecute este comando:

git config --global core.ignorecase true

Tenga en cuenta que esto afectará más que los nombres de las sucursales. Por ejemplo, si tiene "Foo.h" y "foo.h" en el mismo directorio (no es una gran idea al crear software para Windows), sospecho que no puede desactivar la distinción entre mayúsculas y minúsculas.

Stéphane
fuente
2

Solo verifique si alguien eliminó la rama en el control remoto.

AB Abhi
fuente
1

En mi caso, había eliminado la rama original de la que derivaba mi rama actual. Entonces, en el archivo .git / config tuve:

[branch "simil2.1.12"]
    remote = origin
    merge = refs/heads/simil2.0.5
    rebase = false

el simil2.0.5 fue eliminado. Lo reemplacé con el mismo nombre de rama:

[branch "simil2.1.12"]
    remote = origin
    merge = refs/heads/simil2.1.12
    rebase = false

Y funcionó

Guilherme Campos Hazan
fuente
1

Puede vincular fácilmente su sucursal local con una remota ejecutando:

git checkout <your-local-branch>
git branch --set-upstream-to=origin/<correct-remote-branch> <your-local-branch>
git pull
Gendos-ua
fuente
0

Para mí, esto sucedió porque fusioné un desarrollador de rama en maestro usando la interfaz web y luego intenté sincronizar / extraer usando VSCode que estaba abierto en la rama de desarrollo (es extraño que no pueda cambiar a maestro sin obtener este error).

git pull
Your configuration specifies to merge with the ref 'refs/heads/dev'
from the remote, but no such ref was fetched.'

Tiene sentido que no lo encuentre refs / heads / dev: para mí fue más fácil eliminar la carpeta local y clonar nuevamente.

Dawit
fuente
0

Acabo de recibir exactamente este error al hacer "git pull" cuando mi disco estaba lleno. Creé algo de espacio y todo comenzó a funcionar bien nuevamente.

user7550381
fuente
0

Puede editar el ~/.gitconfigarchivo en su carpeta de inicio. Aquí es donde se guardan todas las configuraciones globales.

O bien, use git config --global --unset-all remote.origin.urly después de ejecutar git fetchcon la URL del repositorio.

Angelo Mendes
fuente
0

Estaba enfrentando el mismo problema donde mi sucursal actual era dev y estaba yendo a la sucursal de MR y haciendo git pull a partir de entonces. Una solución fácil que tomé fue que creé una nueva carpeta para MR Branch e hice git pull allí seguido de git clone.

Básicamente, mantuve diferentes carpetas para insertar código en diferentes ramas.

Monalisa Das
fuente
0

Acabo de recibir el mismo error, cuando no usé el caso correcto. Podría verificar 'integración'. Git me dijo que realizara una git pullactualización de mi sucursal. Lo hice, pero recibí el error mencionado. El nombre correcto de la sucursal es 'Integración' con una 'I' mayúscula. Cuando revisé esa rama y tiré, funcionó sin problemas.

emi-le
fuente
-2

Si otro tirón simplemente funciona, significa que su internet no estaba conectado.

Pirolista
fuente
Una serie de votos negativos y, sin embargo, esta fue la causa que tuve de recibir este error. Tenía Internet pero había perdido la VPN en mi servidor git. Después de reconectarse a la VPN, el tirón funcionó bien.
Ben Thurley