2012-08-06 13 views
5

¿Puede alguien dar un ejemplo simple de lo que causaría que un empuje de Git a un repositorio central fallara debido a que un avance rápido no podría ocurrir? ¿Para qué debería ser el repo local frente al repositorio central? Realmente tiene problemas para visualizar esto ...¿Qué significa que un empuje de Git no se puede fusionar rápidamente?

+0

¡Excelente pregunta! Muchas personas no entienden eso, pero la mayoría de las preguntas que encontré aquí no están bien redactadas. – erikbwork

Respuesta

11

que asumir que se está viendo este problema:

! [rejected]  master -> master (non-fast-forward) 
error: failed to push some refs to '/Users/mayoff/t/test/central' 
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. 

Así es como “fueron rechazadas actualizaciones no avance rápido” el problema ocurre.

Digamos que Alice y Bob están trabajando en un proyecto. Cada uno de ellos tiene un repositorio, y hay un repositorio central desde el que empujan y extraen. Inicialmente, los tres repositorios este aspecto:

initial synchronized repos

Ahora Alice y Bob tanto hacer algún trabajo. Cada uno se dedica un cambio diferente a su repositorio local:

private repos have new commits

A continuación, empuja Alice le cambio en el repositorio central de:

central repo updated by Alice

A continuación, Bob trata de empujar. La rama maestra del repositorio central apunta al compromiso 3. El empuje de Bob intenta actualizarlo para apuntar a compromiso 4. Dado que el compromiso 4 no tiene el compromiso 3 como antepasado, se requiere una fusión, pero git push no realiza fusiones reales. Solo hace "avance rápido", donde el nuevo maestro tiene al viejo maestro como antepasado. Entonces Bob obtiene el error porque está tratando de impulsar algo que requiere una combinación real, no un avance rápido.

Para empujar con éxito, Bob tiene que ir a buscar primero la nueva confirmación desde el repositorio central de:

Bob has fetched Alice's commit

y tiene que fusionar sus cambios (commit # 4) con los cambios de Alice (comprometen # 3) , la creación de un nuevo compromiso que tiene tanto compromete como antepasados:

Bob has merged the commits

la zona de alcance y se fusionan se puede hacer de dos comandos (git fetch seguido de git merge) o en un comando (git pull).

Ahora Bob puede presionar con éxito, porque el repositorio central ve que el nuevo maestro tiene el antiguo maestro como antecesor.

Bob pushed the merge

en cuenta que ahora Alice falta confirmaciones de Bob. Si hace más compromisos con su repositorio e intenta presionar antes de retirarse del repositorio central, recibirá el error de no avance rápido, y tendrá que buscar y fusionar para arreglarlo, al igual que Bob.

+0

Me acabo de dar cuenta de que todas mis flechas apuntan en el sentido equivocado. Oh bien.Espero que esté lo suficientemente claro. –

+0

Bueno, ahora muestran el desarrollo a tiempo y no el árbol git. Eso tampoco es tan malo. – erikbwork

+0

consistencia es la clave. y apuntar en la dirección del avance del tiempo puede ser más cómodo para algunas personas. – araqnid

0

Simplemente haga una confirmación en el repositorio central en la misma rama sin tirar a la local. Luego, comprométase localmente e intenta empujar.

Cuestiones relacionadas