2012-09-29 21 views
72

Escenario:Git dice rama local está detrás de la rama remota, pero no es

  1. hago una nueva rama
  2. truco en él
  3. cometerlo
  4. empuje que
  5. hackearlo un poco más
  6. commit again
  7. tratar de empujar de nuevo

Git responde:

actualizaciones fueron rechazadas debido a que la punta de la rama actual está detrás su homólogo remoto. etc.

yo soy el único que la piratería en esta rama - nadie más lo está tocando. La rama remota es en realidad detrás de la sucursal local. No debería tener que tirar para nada.

(Y si yo saco, Git informa de conflictos entre los dos, y me obliga a fusionar la rama en sí mismo)

¿Por qué es esto (probable) pasando? ¿Y cómo puedo diagnosticarlo/corregirlo?

Para que quede claro, no estoy de ramificación en cualquier lugar, y nadie más está trabajando en ello:

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

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

C es una continuación directa de B, ninguna ramificación involucrados. Pero git piensa que C es una rama de A:

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

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

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

+1

La salida de 'git remoto -V' y' origen controlado a distancia git espectáculo (asumiendo origen es el mando a distancia tiene problemas con) puede ser útil –

Respuesta

182

¿Probablemente reescribió algo la historia? Su sucursal local divergió de la del servidor. Ejecutar este comando para obtener una mejor comprensión de lo que sucedió:

gitk HEAD @{u} 

Yo recomendaría encarecidamente que intenta entender de dónde viene este error. Para solucionarlo, basta con ejecutar:

git push -f 

El -f hace de este un “empuje forzado” y sobrescribe la rama en el servidor. Eso es muy peligroso cuando trabajas en equipo. Pero ya que está solo y seguro de que su estado local es correcto esto debería estar bien. Te arriesgas a perder el historial de compromisos si ese no es el caso.

+12

Eso fue todo. En el paso 2, hice un "Enmendar el último compromiso", luego empujé, luego corté un poco más y luego intenté empujar nuevamente. Entendí mal la forma en que funciona. ¡Gracias! –

+3

Esto parece realmente útil, pero ¿podría alguien explicar la sintaxis 'HEAD @ {u}'? – ChrisV

+3

Tanto 'HEAD' como' @ {u} 'se refieren a confirmaciones. Le dicen a gitk qué ramas mostrar. 'HEAD' se refiere a la rama actualmente desprotegida,' @ {u} 'es la abreviatura de' HEAD @ {u} ', que representa la rama ascendente de la rama actualmente desprotegida. Entonces por ejemplo 'master', que es usualmente' origin/master'. – Chronial

4

Esto me sucedió cuando estaba tratando de empujar la rama de desarrollo (estoy usando git flow). Alguien tenía actualizaciones push para master.para arreglarlo, lo hice:

git co master 
git pull 

Lo que se obtenían esos cambios. Luego,

git co develop 
git pull 

Lo que no hizo nada. Creo que la rama de desarrollo ya empujó a pesar del mensaje de error. Todo está actualizado y no hay errores.

0

Para diagnosticarlo, siga this answer.

Pero para solucionarlo, sabiendo que eres el único que cambiarlo, hacer:
1 - copia de seguridad de su proyecto (lo hice sólo los archivos de git, ./src carpeta)
2 - git pull
3 - restaurar su copia de seguridad sobre los muchos archivos "perdidos" (con indicadores de fusión)

Probé git pull -s recursive -X ours pero no funcionó como yo quería, ¡podría ser una opción, pero primero haga una copia de seguridad!

Asegúrate de que las diferencias/cambios (en git gui) no sean ninguno. Este es mi caso, no hay nada que fusionar en absoluto, pero github sigue diciendo que debo fusionar ...

0

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

Prueba esto:

git pull --rebase <url> 

continuación

git push -u origin master 
Cuestiones relacionadas