2011-11-30 9 views
5

He leído algunas explicaciones para un impulso de git roto, pero ninguno de ellos parece cubrir este caso.fallo de inserción de git sin conflicto

No puedo enviar mis cambios locales a un repositorio remoto, incluso después de una extracción y sin conflictos.

$ git pull 
Already up-to-date 

$ git st 
# On branch unstable 
nothing to commit (working directory clean) 

$ git push 
To ssh://<url> 
! [rejected]  master -> master (non-fast-forward) 
error: failed to push some refs to 'ssh://<url>' 
To prevent you from losing history, non-fast-forward updates were rejected 
Merge the remote changes (e.g. 'git pull') before pushing again. See the 
'Note about fast-forwards' section of 'git push --help' for details. 

<url> es, por supuesto, la verdadera URL de mi repositorio.

No hay cambios que extraer, no hay conflictos, y no estoy seguro de qué otra cosa podría hacer que esto falle.

Creo que tengo todo configurado correctamente:

$ git remote -v 
origin ssh://<url> (fetch) 
origin ssh://<url> (push) 

$ git branch -v 
    master 175a09d [behind 18] openReview must now be called from thread other than main. 
* unstable c9e5cab Progress on attachments. 

En el pasado, sólo he eliminado mi repositorio local. Sin embargo, esto está sucediendo con más frecuencia.

  1. ¿Qué hizo que esto sucediera?
  2. ¿Cómo puedo evitarlo en el futuro?
  3. ¿Cómo se supone que voy a arreglar esto?

Respuesta

4

Divulgación completa - mi git está un poco oxidado, por lo que puede no ser 100% correcto.

Parece que su rama 'maestra' local está detrás de la rama maestra de 'origen'. Cuando ejecute 'git push', intentará actualizar todas las sucursales remotas con sus sucursales locales correspondientes. Para empujar su rama actual, intente git push origin unstable. Además, si desea que su sucursal maestra local se actualice, consulte la rama principal y ejecute git pull.

+0

Esta respuesta es correcta. Ver también: http://stackoverflow.com/a/8301464/156060 –

+0

Tienes razón. El problema es la rama principal, que no me di cuenta de que tenía que tirar primero. Además, ¿significa esto que 'git pull --all' es la contrapartida real de' git push'? –

1

Git básicamente se queja de que su historial local es diferente del historial remoto. Esto puede suceder si rebase su bifurcación, o generalmente hace cualquier cosa que modifique las revisiones ya comprometidas después de que las ha insertado.

Para solucionarlo, acaba de hacer

git push -f #Warning, this will essentially clobber revisions on origin with your local revisions. 

La cosa importante es que "fueron rechazadas actualizaciones no avance rápido." Normalmente, Git solo puede copiar sus revisiones en el repositorio remoto y ejecutar HEAD hasta la revisión más reciente. Sin embargo, si su historial es diferente (editó una revisión en su ubicación local después de haberlo transferido al control remoto), no puede avanzar rápidamente.

+0

'push --force' debería ser un último recurso. Ver la respuesta de @ DanR en su lugar. –

+0

+1 for --force es el último recurso. Hay muy pocas situaciones en las que usaría --force. --force tiene graves efectos secundarios para el resto de tus usuarios. –

0

Tuve los mismos problemas en estos días, está intentando hacer una actualización 'no rápida'. Como puede leer en la ayuda escribiendo git push --help y leyendo la 'nota sobre adelantos rápidos', comenzó localmente un historial que es diferente al que tiene en su repositorio. Si está SEGURO de que su sucursal local está actualizada, puede forzar un empuje usando git push --force para sobrescribir su repositorio remoto con su local.

+0

'push --force' debería ser un último recurso.Ver la respuesta de @ DanR en su lugar. –

Cuestiones relacionadas