¿Qué significa que un empuje de Git no se puede unir rápidamente?

¿Puede alguien proporcionar un ejemplo simple de lo que causaría que un empuje de Git a un repository central fallara debido a que un avance rápido no podría ocurrir? ¿Para qué debería ser el repo local frente al repository central? Realmente tengo problemas para visualizar esto …

Supongo que estás 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 (eg 'git pull') before pushing again. See the 'Note about fast-forwards' section of 'git push --help' for details. 

Así es como ocurre el problema de "actualizaciones no de avance rápido".

Digamos que Alice y Bob están trabajando en un proyecto. Cada uno de ellos tiene un repository, y hay un repository central desde el que empujan y extraen. Inicialmente, los tres repositorys se ven así:

repositorios sincronizados iniciales

Ahora Alice y Bob hacen algo de trabajo. Cada uno comete un cambio diferente en su repository local:

repositorios privados tienen nuevos commits

A continuación, Alice empuja su cambio al repository central:

Repo central actualizado por Alice

Luego, Bob intenta empujar. La twig maestra del repository central señala en el compromiso 3. El empuje de Bob intenta actualizarlo para apuntar a compromiso 4. Dado que el compromiso 4 no tiene el compromiso 3 como antecesor, 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 avanzar con éxito, Bob primero debe recuperar la nueva confirmación del repository central:

Bob ha buscado el compromiso de Alice

y tiene que fusionar sus cambios (commit # 4) con los cambios de Alice (commit # 3), creando un nuevo commit que tiene ambos commits como antepasados:

Bob ha fusionado los commits

La búsqueda y fusión se puede hacer en dos commands ( git fetch seguido de git merge ) o en un command ( git pull ).

Ahora Bob puede empujar con éxito, porque el repository central ve que el nuevo maestro tiene al viejo maestro como antecesor.

Bob empujó la fusión

Fíjate que ahora a Alice le faltan las confirmaciones de Bob. Si hace más compromisos con su repository e intenta presionar antes de retirarse del repository central, recibirá el error de no avance rápido, y tendrá que search y fusionar para arreglarlo, al igual que Bob.

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