Git dice que la rama local está detrás de la rama remota, pero no

83

Guión:

  1. Hago una nueva rama
  2. piratearlo
  3. cometerlo
  4. empujalo
  5. hackearlo un poco más
  6. comprometerse de nuevo
  7. intenta empujar de nuevo

Git responde:

Las actualizaciones se rechazaron porque la punta de su rama actual está detrás de su contraparte remota. etc.

Soy el único que hackeando esta rama; nadie más la está tocando. La rama remota está realmente detrás de la rama local. No debería tener que tirar en absoluto.

(Y si lo hago, Git informa conflictos entre los dos y me obliga a fusionar la rama en sí misma)

¿Por qué (probablemente) está sucediendo esto? ¿Y cómo puedo diagnosticarlo / solucionarlo?

Para ser claros, no me estoy ramificando en ningún lado y nadie más está trabajando en eso:

Remote: Commit A -------- Commit B  

Local:  Commit A -------- Commit B -------- Commit C  

C es una continuación directa de B, sin ramificaciones involucradas. Pero git piensa que C es una rama de A:

Remote: Commit A -------- Commit B  

                  ------- Commit C  
                /  
Local:  Commit A -------- Commit B  

No es; es una continuación directa de B.

Tim Janke
fuente
1
La salida de git remote -vy git show remote origin(asumiendo que el origen es el control remoto con el que tiene problemas) puede ser útil
Ben Graham

Respuestas:

197

¿Probablemente reescribiste la historia? Su sucursal local divergió de la del servidor. Ejecute este comando para comprender mejor lo que sucedió:

gitk HEAD @{u}

Le recomiendo encarecidamente que intente comprender de dónde proviene este error. Para solucionarlo, simplemente ejecute:

git push -f

La -fhace de este un “empuje forzado” y sobrescribe la rama en el servidor. Eso es muy peligroso cuando se trabaja en equipo. Pero como está solo y seguro de que su estado local es correcto, esto debería estar bien. Corre el riesgo de perder el historial de confirmaciones si ese no es el caso.

Crónico
fuente
13
Eso fue todo. En el paso 2, hice un "Modificar última confirmación", luego presioné, luego pirateé un poco más, luego intenté presionar nuevamente. Entendí mal la forma en que funciona Modificar. ¡Gracias!
Tim Janke
4
Esto parece realmente útil, pero ¿alguien podría explicar la sintaxis 'HEAD @ {u}'?
ChrisV
5
Tanto el HEADcomo el se @{u}refieren a confirmaciones. Le dicen a gitk qué ramas mostrar. HEADse refiere a la rama actualmente extraída, @{u}es la abreviatura de HEAD@{u}, que representa la rama ascendente de la rama actualmente extraída. Entonces, por ejemplo. master, eso es usualmente origin/master.
Crónica
Tenía el mismo escenario: tenía que volver a escanear y fusionar conflictos. ¡Usar gitkayudó mucho!
brichins
Me pasa si realizo muchas confirmaciones simples localmente (no enmiendas) e intento presionar. Sé que nadie más está cambiando las cosas en github. Gitk realmente mostró que el control remoto era diferente al local, a pesar de que se esperaba, debería mostrar el local como una versión más nueva que el control remoto y no el control remoto como una bifurcación (se veía así, no sé mucho gitk para contar)
Poder de Acuario
5

La solución es muy simple y funcionó para mí.

Prueba esto :

git pull --rebase <url>

entonces

git push -u origin master
theRana
fuente
4

Esto me sucedió cuando intentaba impulsar la rama de desarrollo (estoy usando git flow). Alguien tenía actualizaciones automáticas para dominar. para arreglarlo hice:

git co master
git pull

Que trajo esos cambios. Entonces,

git co develop
git pull

Que no hizo nada. Creo que la rama de desarrollo ya presionó a pesar del mensaje de error. Todo está actualizado ahora y sin errores.

Daniel
fuente
0

Para diagnosticarlo, siga esta respuesta .

Pero para solucionarlo, sabiendo que usted es el único que lo está cambiando, haga:
1 - haga una copia de seguridad de su proyecto (solo hice los archivos en git, carpeta ./src)
2 - git pull
3 - restaure su copia de seguridad sobre los muchos archivos "desordenados" ( con indicadores de fusión)

Lo intenté git pull -s recursive -X ourspero no funcionó de la manera que quería, aunque podría ser una opción, ¡¡¡pero copia de seguridad primero !!!

Asegúrese de que las diferencias / cambios (en git gui) no sean ninguno. Este es mi caso, no hay nada que fusionar, pero github sigue diciendo que debería fusionarme ...

Poder de Acuario
fuente