¿Cómo combinar cambios remotos en GitHub?

137

Recibo el siguiente error, al intentar el primer impulso de Github:

[rejected] master -> master (non-fast forward)
error: failed to push some refs to '[email protected]:me/me.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again.  See the 'non-fast forward'
section of 'git push --help' for details.

¿Cómo puedo solucionar esto y combinar cambios remotos?

John
fuente

Respuestas:

106

Vea la sección 'avance no rápido' de ' git push --help ' para más detalles.

Puede realizar "git pull", resolver conflictos potenciales y "git push" el resultado. Un "git pull" creará una confirmación de fusión C entre las confirmaciones A y B.

Alternativamente, puede cambiar el tamaño de su cambio entre X y B encima de A, con "git pull --rebase", y hacer retroceder el resultado. El rebase creará un nuevo commit D que construye el cambio entre X y B sobre A.

Thilo
fuente
16
Sigo encontrándome con esto, excepto que si hago un "git pull" me dicen "Ya estoy actualizado". y si hago un "git pull --rebase" me dicen que "el maestro de sucursal actual está actualizado". ¿Algunas ideas? ¡Gracias!
jwl
3
@ larson4 Tengo el mismo problema, pero después de que lo hagas git pull, haz otro commit y luego debería estar bien
Patrick
20
@Patrick @larson Tuve un problema similar causado por el hecho de que no leí el mensaje de error con cuidado. El rechazo estaba en una rama que no había comprobado. La rama en la que estaba estaba teniendo éxito. La solución fue a git checkout other-branch; git pull; git push; git checkout branch-i-was-working-on.
Noah Spurrier
86

También puede forzar una inserción agregando el símbolo + antes del nombre de su sucursal.

git push origin +some_branch
SammyK
fuente
1
Gracias, este me funciona. Las otras soluciones borrarían completamente el efecto de migit reset --hard
Oli
1
¡Gracias! Había empujado la rama "A" hasta mi aplicación de preparación Heroku para probar algunas funcionalidades en un entorno de producción. Luego (localmente) fusioné "A" y "B" en "maestro" y quería insertar "maestro" en mi aplicación de preparación. Estaba teniendo todo tipo de problemas. Esto hizo que empujar al "maestro" fuera muy simple. ¡Gracias!
Don Leatham
A mí también me funcionó. Me tomó 4 horas encontrar el problema. Muchas gracias. Ejecuté Netbeans en la máquina local (Windows 7) y quería en cada inserción local, verificar en la máquina remota (Linux).
Maxim Shoustin
Tenga en cuenta que este método puede no ser seguro y puede hacer que algunas confirmaciones divergentes sean inalcanzables.
samuil
Esta debería ser la solución aceptada. Las otras soluciones no funcionaban para mí
Banarun
20

Probablemente tenga cambios en github que nunca fusionó. Intente git pullbuscar y fusionar los cambios, entonces debería poder empujar. Lo siento si entendí mal tu pregunta.

Jorge Israel Peña
fuente
18
En caso de que necesite rechazar cambios en el maestro remoto y enviar sus propios cambios, intente presionar con la tecla -f
Hotsyk
13

Si "git pull" y dice "Ya está actualizado", y aún recibe este error, podría deberse a que una de sus otras ramas no está actualizada. Intente cambiar a otra rama y asegúrese de que una también esté actualizada antes de intentar "git push" nuevamente:

Cambie a la rama "foo" y actualícela:

$ git checkout foo
$ git pull

Puede ver las ramas que tiene emitiendo un comando:

$ git branch
David Calhoun
fuente
¿Puedes explicar por qué esto funciona y es necesario? (Sí resolvió mi problema). Simplemente me parece contrario a la intuición. No entiendo por qué git necesitaría otra rama para estar actualizada también para que yo empuje la rama maestra.
Quinxy von Besiex
@QuinxyvonBesiex No estoy seguro de que yo mismo entienda. Puede tener algo que ver con la estructura subyacente de Git en sí y con la forma en que organiza las ramas (que son, básicamente, lo mismo que yo entiendo).
David Calhoun
7

Puede forzarlo a empujar, pero haga esto SOLO cuando esté bastante seguro de lo que está haciendo.

El comando es:

git push -f 
JuLy
fuente
3

Este problema también puede ocurrir cuando tiene etiquetas en conflicto. Si su versión local y la versión remota usan el mismo nombre de etiqueta para diferentes confirmaciones, puede terminar aquí.

Puedes resolverlo borrando la etiqueta local:

$ git tag --delete foo_tag
Zds
fuente
2

Cuando recibí este error, hice una copia de seguridad de toda mi carpeta de proyecto. Entonces hice algo como

$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master

... dependiendo del nombre de su sucursal (si no es maestro).

Entonces lo hice git pull --rebase . Después de eso, reemplacé los archivos extraídos con los archivos de mi proyecto respaldado. Ahora estoy listo para comprometer mis cambios nuevamente y presionar.

IgorGanapolsky
fuente
0

1) Forzar un tirón para sobrescribir los cambios locales

Si no le importan los cambios realizados localmente y desea obtener el código del repositorio, puede forzar una extracción. Esto sobrescribirá todos los cambios locales realizados en su computadora y aparecerá una copia duplicada de la versión en el repositorio.

Ejecute los siguientes comandos en su IDE:

git reset - duro

git pull

Esto destruirá instantáneamente todos sus cambios locales, así que asegúrese de saber lo que está haciendo y no necesita sus cambios locales.

2) Mantener ambos cambios (local y del repositorio)

Si desea mantener ambos cambios (cambios realizados localmente y cambios presentes en el repositorio), puede agregar y confirmar sus cambios. Cuando tire, obviamente habrá un conflicto de fusión. Aquí puede usar las herramientas en su IDE (como Difftool y mergetool) para comparar las dos piezas de código y determinar qué cambios mantener y cuáles eliminar. Este es el camino del medio; no se perderán cambios hasta que los elimine manualmente.

git add $ the_file_under_error

git commit

git pull
Preeti Duhan
fuente