Su configuración especifica fusionarse con el <nombre de sucursal> del control remoto, pero no se obtuvo dicha referencia.
Recibo este error al extraer:
Su configuración especifica fusionarse con la referencia 'refs/heads/feature/Sprint4/ABC-123-Branch' del control remoto, pero no se obtuvo dicha referencia.
Este error no se produce en ninguna otra rama.
Lo especial de esta rama es que se crea a partir del commit previo de otra rama.
Mi archivo de configuración se parece a:
[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
Lo que esto significa
Su upstream, el control remoto al que llama origin
, ya no tiene, o tal vez nunca tuvo (es imposible saberlo solo con esta información) una rama llamada feature/Sprint4/ABC-123-Branch
. Hay una razón particularmente común para esto: alguien (probablemente no tú, o lo recordarás) eliminó la rama en ese otro repositorio de Git.
Qué hacer
Esto depende de lo que quieras . Consulte la sección de discusión a continuación. Puede:
- crear o recrear 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 ejecutándose, git merge
recibiría un mensaje de error diferente o ningún mensaje de error).
Cuando ejecuta git fetch
, su Git contacta con otro Git, según la url
línea 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 tu Git una lista de todas las ramas. Puedes usarlo git ls-remote
para ver cómo funciona (pruébalo, es educativo). Aquí hay un fragmento de lo que obtengo cuando ejecuto esto en un repositorio Git git
:
$ 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 (para refs/tags/
las entradas, los ID pueden apuntar a objetos de etiqueta en lugar de confirmaciones).
Su Git toma cada uno de estos nombres de sucursales y los cambia de acuerdo con las fetch
líneas en esa misma remote
sección. En este caso, su Git se reemplaza refs/heads/master
con refs/remotes/origin/master
, por ejemplo. Tu Git hace esto con cada nombre de rama que aparece.
También registra los nombres originales en el archivo especial FETCH_HEAD
(puede ver este archivo si echa un vistazo a su propio .git
directorio). Este archivo guarda los nombres e ID obtenidos.
El git pull
comando pretende ser un atajo conveniente: se ejecuta git fetch
en el control remoto apropiado y luego git merge
(o, si así se indica, git rebase
) con los argumentos necesarios para fusionar (o rebase) según lo indicado en la [branch ...]
sección. En este caso, su [branch "feature/Sprint4/ABC-123-Branch"]
sección dice buscar desde origin
y 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, git pull
se queja y se detiene.
Si ejecuta esto en dos pasos separados, git fetch
y luego git merge
(o git rebase
), su Git mirará sus remotes/origin/
ramas de seguimiento remoto en caché para ver con qué fusionarse o rebase. Si alguna vez existió una sucursal de este tipo, es posible que aún tenga la sucursal de seguimiento remoto. En este caso, no recibirá ningún mensaje de error. Si nunca existió una rama de este tipo, o si ejecutó git fetch
con --prune
(que elimina las ramas de seguimiento remoto inactivas), de modo que no tiene una rama de seguimiento remoto correspondiente, recibiría una queja, pero origin/feature/Sprint4/ABC-123-Branch
en su lugar se referiría a ella.
En cualquier caso , podemos concluir que feature/Sprint4/ABC-123-Branch
ya no existe en el remoto nombrado origin
.
Probablemente existió en algún momento y probablemente creó su sucursal local a partir de la sucursal de seguimiento remoto. Si es así, probablemente todavía tengas 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 recrearla o eliminar su rama de seguimiento remoto y/o su rama local.
1 Bueno, al menos todo eso va a admitir . Pero a menos que hayan ocultado específicamente algunas referencias, la lista lo incluye todo.
Editar, julio de 2020: Hay un nuevo protocolo de búsqueda que puede evitar enumerar todo y solo enumerar los nombres que su Git dice que está buscando. Esto puede ayudar con repositorios que tienen una gran cantidad de ramas y/o etiquetas. Sin embargo, si su Git está interesado en todos los nombres posibles, aún obtendrá todos los nombres aquí.
Esto también puede suceder si usted/alguien cambia el nombre de la sucursal. Así que siga estos pasos (si sabe que se ha cambiado el nombre de la sucursal): suponiendo que el nombre de la sucursal anterior sea wrong-branch-name
y alguien le cambió el nombre a correct-branch-name
So.
git checkout correct-branch-name
git pull
(Verá esto "Su configuración especifica...")
git branch --unset-upstream
git branch --set-upstream-to=origin/correct-branch-name
para versiones anteriores de gitgit push --set-upstream origin correct-branch-name
git pull
(no recibirás el mensaje anterior)
Verifique si su sucursal remota está disponible para realizar operaciones de extracción. Tuve el mismo problema y finalmente me di cuenta de que alguien eliminó la rama remota.
Este es un error más común ahora, ya que muchos proyectos están moviendo su rama a otro master
nombre como main
,,,,,,, primary
etc. , como se discutió en Github, los planes para reemplazar términos racialmente insensibles como "maestro" y default
" lista blanca" .root
reference
latest
Para solucionarlo, primero averigüe qué está usando ahora el proyecto, que puede encontrar a través de su github, gitlab u otro servidor git.
Luego haga esto para capturar la configuración actual:
$ git branch -vv
...
* master 968695b [origin/master] Track which contest a ballot was sampled for (#629)
...
Busque la línea que describe la master
rama y observe si el repositorio remoto se llama origin
o upstream
lo que sea.
Luego, usando esa información, cambie el nombre de la sucursal por uno nuevo; por ejemplo, si dice que actualmente está realizando un seguimiento origin/master
, sustitúyalo main
:
git branch master --set-upstream-to origin/main
También puedes cambiar el nombre de tu propia sucursal para evitar futuras confusiones:
git branch -m main