error de extracción de git: error: la referencia remota está en pero se esperaba

227

Mensaje completo:

error: Ref refs/remotes/origin/user is at 3636498c2ea7735fdcedc9af5ab3c8689e6abe77 but expected a21359c6cc2097c85775cde6a40105f4bd7100ec
From github.com:{github project url}
 ! a21359c..6273ffc  user -> origin/user  (unable to update local ref)
Sanjeev Kumar Dangi
fuente
3
Al parecer, alguien reescribió la historia del repositorio por git push --force. Intenta correr git pull --force.
xaizek
1
Da el mismo error con git push --force
Sanjeev Kumar Dangi
55
La respuesta a esta pregunta resolvió este error - stackoverflow.com/questions/3046436/…
Sanjeev Kumar Dangi

Respuestas:

225

Si está ejecutando git en un sistema de archivos que no distingue entre mayúsculas y minúsculas (Windows u OS X), esto ocurrirá si hay dos ramas con el mismo nombre pero con mayúsculas diferentes, por ejemplo user_model_changes y y User_model_changesambas ramas remotas coincidirán con la misma referencia de seguimiento .

Elimine la rama remota incorrecta (no debería tener ramas que difieran solo por caso) y luego git remote prune origintodo debería funcionar

krijesta
fuente
gracias por responder. Este no era el problema con este error. Ya encontré la solución a este problema y publiqué un comentario debajo de la pregunta.
Sanjeev Kumar Dangi el
2
Ayuda también para Mac OS X (el sistema de archivos predeterminado no distingue entre mayúsculas y minúsculas).
Tammo Freese
12
Sí, el problema entre mayúsculas y minúsculas en Windows causó el problema. Lo arreglé eliminando manualmente la referencia en la .git\refs\remotes\origincarpeta y luego git pullnuevamente.
Roy Ling
y para aquellos que no saben dónde estará la carpeta .git ... se creará dentro de su carpeta Proyecto / espacio de trabajo: D
kumar
1
Este es un error de git. (Al menos el mensaje de error es incorrecto). Espero que alguien pueda informar este error al proyecto git. Me parece difícil informar un error al proyecto git. github.com/git/git
hombre de bronce
190

Arreglo permanente

git update-ref -d resolvió mi instancia de este error, por ejemplo

git update-ref -d refs/remotes/origin/user

Tenga en cuenta que esto no afecta el control remoto.

En mi caso, una git fetchbúsqueda posterior de esa rama de nuevo, y después de las descargas / extracciones de git ya no dio el error "la referencia remota está en pero se esperaba".

Si eso no funciona, una solución temporal:

Tenga en cuenta también que si no le importa la rama en cuestión (por ejemplo, solo desea actualizar el maestro, no el origen / usuario), una git pullsolución es buscar y luego fusionar la rama particular que le interesa, por ejemplo

git fetch # may give an error for a particular branch, but other branches will still be successfully fetched
git merge origin/master
JDiMatteo
fuente
Esta debería ser la solución aceptada porque resuelve el problema sin tocar el control remoto.
Cerno
52

Simplemente elimine las carpetas y archivos debajo \.git\refs\remotes\origin. Funciona, cuando no tienes cambios no apresurados.

Prakash Saravanan
fuente
Esto podría no funcionar si su referencia remota está 'empaquetada' y, por lo tanto, no está en refs / remotes / ** @ La solución de JDiMatteo debería funcionar entonces todavía
Alexander Bird
2
Trabajó para mi. ¡Gracias una tonelada!
Swapnil Patwa
¡Trabajado como un encanto! ¡Gracias!
Anurag S Sharma
43

Ejecuté esto para resolver el problema:

git gc --prune=now
elad plata
fuente
2
Esto solucionó el problema para mí.
Aamir Rizwan
2
para mí también ..-- :)
Aravind R Pillai
3
Gracias, esta solución me solucionó. ¿Podría explicar un poco más sobre la solución que proporcionó?
Aamol
1
básicamente es sólo una herramienta recolector de basura git por lo que borra todo lo que no está en sincronía, pero es en el equipo local con fines de almacenamiento en caché
plata Elad
42

Use los dos comandos a continuación uno por uno.

git gc --prune=now

git remote prune origin

Esto resolverá tu problema.

Narender Gusain
fuente
1
Esto funciona para mí, pero cuando hago otro git pull, este problema vuelve a aparecer
Jojin
@Jojin Igual que tú. Y finalmente elegí la forma en que Prakash Saravanan proporcionó
xi.lin
1
Esto debería tener una calificación más alta que la sugerencia de editar archivos git :)
Mike Wise
solo esta solución me funcionó. ¡Gracias!
insaineyesay
12

Tuve que eliminar mi rama de mi línea de comando en:

.git\refs\remotes\{my remote}\{**my branch**}

y luego haciendo manualmente:

git pull [remote_name] [branch_name]

Pude hacer los cambios.

Nota: Estaba usando SourceTree y no pude hacer la extracción.

jogam5
fuente
Finalmente, cambié el nombre de mis controles remotos: tenía dos controles remotos "Bitbucket / staging" y "bitbucket / staging" en mi historial de SourceTree, pero solo "Bitbucket" apareció en la línea de comando al hacer: git remote -v. Así que cambié el nombre de Bitbucket a bitbucket y el conflicto finalmente desapareció, espero que esto ayude a los usuarios más probables de SourceTree.
jogam5
También tuve que quitar la rama .git\packed-refsantes de que me la arreglaran.
Michael
6

Un restablecimiento completo también resolverá el problema

git reset --hard origin/master
mruanova
fuente
¿Has seleccionado la mejor respuesta?
mruanova
5

Pasos más claros

  1. en terminal

    cd /.git/refs/remotes/origin
    
  2. Qué ls, verá algunas ramas y CABEZA

  3. Elimina la rama que crees que tiene el problema

    rm branchname
    
  4. Si no funcionó, elimine todas las ramas / HEAD

    • puedes wana tirar

Espero que funcione ahora.

shareef
fuente
¿Es esto esencialmente lo mismo que git update-ref -d <branchname>?
jt000
2

Prueba esto, funcionó para mí. En su terminal: git remote prune origin.

Ranganatha GV
fuente
2

Desafortunadamente, los comandos GIT como podar y restablecer o presionar no funcionaron para mí. Prune funcionó una vez y luego el problema volvió.

La solución permanente que funcionó para mí es editar un archivo git manualmente. Simplemente vaya a la carpeta .git del proyecto y luego abra el archivo empacado-referencias en un editor de texto como Notepad ++. Luego navegue a la fila con la rama que falla y actualice su guid a la esperada.

Si tienes un mensaje como:

"error: no se puede bloquear la referencia 'refs / remotes / origin / feature / branch_xxx': está en 425ea23facf96f51f412441f41ad488fc098cf23 pero se esperaba 383de86fed394ff1a1aeefc4a522d886adcecd79"

luego en el archivo encuentre la fila con 'refs / remotes / origin / feature / branch_xxx'. La guía allí será la esperada (2da): 383de86fed394ff1a1aeefc4a522d886adcecd79. Debe cambiarlo al real (1º): 425ea23facf96f51f412441f41ad488fc098cf23.

Repita para las otras ramas que fallan y estará listo para continuar. A veces, después de volver a buscar, tenía que repetir para las mismas ramas que ya había "arreglado" anteriormente. Al volver a buscar, GIT actualiza las guías y le ofrece la última.

De todos modos, el problema no es un obstáculo para el espectáculo. La lista de sucursales se actualiza. Esto es más bien una advertencia.

Andrei S.
fuente
1

git for-each-ref --format = 'eliminar% (refname)' refs / original | git update-ref --stdin git reflog caduca --expire = ahora --todos git gc --prune = ahora

Luciano
fuente
0

El mismo caso aquí, pero nada sobre los comentarios publicados está bien en mi caso, solo tengo una rama (maestra) y solo uso el sistema de archivos Unix, este error ocurre al azar cuando ejecuto git fetch --progress --prune origin y branch está adelante o 'origen / maestro'. Nadie puede comprometerse, solo 1 usuario puede hacer push.

NOTA: Tengo un submódulo en el repositorio de acme y acme tiene nuevos cambios de submódulo (nuevas confirmaciones), primero necesito hacer una actualización de submódulo con git submodule update.

[2014-07-29 13:58:37] Payload POST received from Bitbucket
[2014-07-29 13:58:37] Exec: cd /var/www/html/acme
---------------------
[2014-07-29 13:58:37] Updating Git code for all branches
[2014-07-29 13:58:37] Exec: /usr/bin/git checkout --force master
[2014-07-29 13:58:37] Your branch is ahead of 'origin/master' by 1 commit.
[2014-07-29 13:58:37]   (use "git push" to publish your local commits)
[2014-07-29 13:58:37] Command returned some errors:
[2014-07-29 13:58:37] Already on 'master'
---------------------
[2014-07-29 13:58:37] Exec: /usr/bin/git fetch --progress --prune origin
[2014-07-29 13:58:39] Command returned some errors:
[2014-07-29 13:58:39] error: Ref refs/remotes/origin/master is at 8213a9906828322a3428f921381bd87f42ec7e2f but expected c8f9c00551dcd0b9386cd9123607843179981c91
[2014-07-29 13:58:39] From bitbucket.org:acme/acme
[2014-07-29 13:58:39]  ! c8f9c00..8213a99  master     -> origin/master  (unable to update local ref)
---------------------
[2014-07-29 13:58:39] Unable to fetch Git data

Para resolver este problema (en mi caso) simplemente ejecute primero git push si su rama está por delante del origen.

Tecnocat
fuente
3
Su respuesta aquí solo se relaciona con el hecho de que su repositorio local está por delante del origen después de una nueva confirmación. Este es el estado natural de una operación de confirmación git local y no se relaciona con la pregunta original.
davient
0

Sé que esto es viejo, pero tengo mi propia solución. Como estoy usando el árbol de origen, este error ocurre porque alguien crea una nueva rama. El árbol fuente está confundido sobre esto. Después de presionar el botón "Actualizar" al lado del cuadro combinado "rama remota para extraer", parece que sourcetree ha actualizado la lista de ramas, y ahora puedo extraer con éxito.

Chen Li Yong
fuente
0

Tuve el mismo problema que se causó porque restablecí una confirmación anterior a pesar de que ya presioné la rama remota.

Lo resolví eliminando mi rama local y luego revisando la rama de origen git checkout origin/my_branchy luego ejecutandogit checkout my_branch

Negro
fuente
-1

Después de buscar constantemente, esta es la solución que funcionó para mí, lo que implica desarmar / eliminar el Upstream

git branch --unset-upstream
Caña Sugoi
fuente