No se puede presionar a GitHub: sigue diciendo que es necesario fusionar


743

Soy nuevo en GitHub . Hoy me encontré con un problema cuando intentaba enviar mi código a GitHub.

Pushing to git@github.com:519ebayproject/519ebayproject.git
To git@github.com:519ebayproject/519ebayproject.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:519ebayproject/519ebayproject.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Todavía no he introducido nada en el repositorio, entonces, ¿por qué necesito extraer algo?


66
Tenga en cuenta que esto también puede suceder para las sucursales visitadas localmente anteriormente, que han tenido confirmaciones en el repositorio ascendente. ¿Hay una manera fácil de avanzar rápidamente una rama tan antigua o simplemente dejar que git se olvide en el repositorio local?
Thorbjørn Ravn Andersen

50
@ ThorbjørnRavnAndersen - Logré arreglar este escenario usando 'git push -f' que parecía hacer que git olvidara sus problemas imaginarios :)
Echelon

66
Visto una queja sobre esto de git recién llegado. La razón es que cuando crean un nuevo proyecto en GitHub, dejan la casilla "Inicializar con léame" o eligen las opciones .gitignore / GPL, por lo que el nuevo proyecto ya tiene una confirmación que no tienen localmente, por lo tanto, la confusión causada por el error anterior.
Ruslan Kabalin

44
@Echelon, la opción -f para forzar el empuje es peligrosa. ¡Lo acabo de usar en un proyecto de equipo y 6 commits fueron "rayados", simplemente borrados del servidor y no hay forma de recuperarlos!
Deleplace

42
Está de moda elogiar a git. Pero casi todos los desarrolladores con los que hablé aceptan en privado que personalmente odian a Git. Ahora que usan git, pasan mucho más tiempo en el control de la fuente en comparación con lo que solían gastar cuando usaban forzosamente o TFS.
developer747

Respuestas:


762

Esto puede hacer que el repositorio remoto pierda confirmaciones; úsalo con cuidado.

Si no desea fusionar la rama remota en su rama local (vea las diferencias con git diff ), y quiere hacer un empuje forzado, use el comando push con -f

git push -f origin <branch>

¿Dónde originestá el nombre de su repositorio remoto ?

Por lo general, el comando se niega a actualizar una referencia remota que no sea un antecesor de la referencia local utilizada para sobrescribirla. Esta bandera deshabilita el cheque. Esto puede hacer que el repositorio remoto pierda confirmaciones; úsalo con cuidado.


1
Esto funcionó para mí para un repositorio que tengo en Github, pero tenía un submódulo de Heroku dentro de mi aplicación. y tuve que sacar los archivos del submódulo y luego enviar la aplicación actualizada a Heroku.
JGallardo

24
¡Asegúrate de leer la última línea del comentario en esta publicación! "Esto puede hacer que el repositorio remoto pierda confirmaciones; úselo con cuidado". Hacer empujones forzados en un entorno de equipo es algo peligroso y, por lo general, debe evitarse.
Adam Kalnas

Esto también puede AGREGAR todo el historial desde el repositorio original al control remoto utilizando cherry-pick para mover 'solo' una confirmación. Restaurar desde la copia de seguridad requerida ...
rickfoosusa

También vale la pena mencionar que si está utilizando Github, esto puede anular una solicitud de extracción abierta que creó anteriormente con sus confirmaciones más recientes. De Github Docs : "Forzar empuje puede corromper su solicitud de extracción".
Footfoot

Esto funcionó para mí. He intentado $ git pull origin master -vpero da error fatal: refusing to merge unrelated histories. Luego probé esto y funcionó y mis archivos locales aparecieron en el repositorio remoto de github.
Vir

238

Como te dice el mensaje,

Combinar los cambios remotos (por ejemplo, 'git pull')

Úselo git pullpara extraer los últimos cambios del repositorio remoto a su repositorio local. En este caso, la extracción de cambios requerirá una fusión porque ha realizado cambios en su repositorio local.

Proporcionaré un ejemplo y una imagen para explicar. Supongamos que su último tirón desde el origen / rama fue en Comprometer B. Ha completado y comprometido algún trabajo (Compromiso C). Al mismo tiempo, alguien más ha completado su trabajo y lo ha llevado a origen / rama (Compromiso D). Deberá haber una fusión entre estas dos ramas.

local branch:                         --- Commit C 
                                    /
                                   /
                                  /
origin/branch: Commit A ------ Commit B ---- Commit D

Como eres el que quiere empujar, Git te obliga a realizar la fusión. Para hacerlo, primero debe extraer los cambios de origen / rama.

local branch:                         --- Commit C -- Commit E
                                    /               /           
                                   /               /             
                                  /               /               
origin/branch: Commit A ------ Commit B ---- Commit D 

Después de completar la fusión, ahora se te permitirá adelantar rápidamente el origen / rama al Compromiso E presionando tus cambios.

Git requiere que manejes las fusiones tú mismo, porque una fusión puede generar conflictos.


77
¿Qué pasa si no quieres fusionarte? Y solo deje D como una rama lateral (al menos por ahora). Más tarde, podría comprometerme más después de C; alguien más podría cometer más después de D. ¿Cuál es la prisa por fusionarse? ¿Cómo puedo empujar una rama lateral sin fusionar? ~~~
Steve Pitchers

3
local / branch y origin / branch están destinados a representar la misma rama pero en máquinas diferentes (local versus origen); empujar local / rama es actualizar origen / rama. Si desea que el estado de su rama sea visible para otros (es decir, en el origen) pero no desea fusionarse con el origen / rama, entonces debe crear una nueva rama fuera de local / rama (git branch [nombre]) y empuje esa rama al origen (git push -u origin [nombre])
Jake Greene

1
Gran explicación Este video muestra una breve demostración del problema y cómo resolverlo como lo describe @JakeGreene, así como dos formas de evitarlo en primer lugar al configurar un nuevo repositorio.
Kevin Markham

44
Algunos años después, parece que esta respuesta es muy similar a la otra
Superjos

1
Para mí git pulltambién impreso Already up-to-date. Resultó que no estaba en la rama, aunque lo estaba, sino una rama HEAD separada (¿posiblemente de una fusión fallida?). Esto fue obvio después de correr git branch. Después de ejecutar git checkout mybranchtodo funcionó como se esperaba.
Strider

200

¿Has actualizado tu código antes de presionar?

Úselo git pull origin masterantes de empujar cualquier cosa.

Supongo que lo está utilizando origincomo nombre para su control remoto.

Debe extraer antes de enviar, para actualizar su repositorio local antes de enviar algo (por si alguien más ya ha actualizado el código github.com). Esto ayuda a resolver conflictos localmente.


1
¿Cómo puedo saber el nombre del repositorio? Cuando git pull origin master'origin' does not appear to be a git repository
escribo

3
'origen' es un control remoto. Puede usar git remote --verbosepara ver todo el control remoto configurado en su carpeta git. La información que se muestra en la pantalla también incluirá rutas "git@github.com" o rutas HTTPS, desde las cuales podrá identificar dónde empujar. Espero que esto ayude !
AYK

16
git pull origin mastermostrando Ya actualizado. pero luego, cuando intente presionar origin_branch, diga la misma advertencia mencionada en la pregunta. Cualquier sugerencia !!
CoDe

2
@Shubh, ¿alguna vez resolviste el problema? Estoy recibiendo lo mismo!
OriginalAlchemist

3
@OriginalAlchemist sí ... ya que solo soy un desarrollador que trabaja en una sucursal local remota ... así que forcé a presionar la sucursal local ... y eso anula todos los cambios de la sucursal abierta en el servidor con mis cambios del sistema local. git push -f <remote> <branch>por ejemplo, git push origin <your_local_branch> revisa este hilo .
Código de

122

Esto normalmente sucede cuando usted git commite intenta realizar git pushcambios antes git pullingen esa rama xdonde otra persona ya ha realizado cambios.

El flujo normal sería el siguiente,

PASO 1 : git stashsus cambios locales no confirmados en esa rama.

PASO 2 : git pull origin branch_name -va los pull and mergecambios comprometidos localmente en esa rama ( déle a esta combinación algún mensaje y solucione los conflictos, si corresponde ) .

PASO 3 : git stash poplos stashcambios ed ( luego puede realizar confirmaciones en los archivos emergentes si lo desea o insertar cambios ya confirmados (PASO 4) primero y realizar una nueva confirmación a los archivos más adelante ) .

PASO 4 : git push origin branch_name -vlos cambios combinados.

Reemplace branch_namecon master(para masterrama).


3
¿Dónde está el commit? ¿No deberías confirmar tus cambios después stash pop?
mehmet

Yo debería. Generalmente empujo el código combinado primero y luego confirmo mis cambios locales no confirmados. Puede comprometerse y presionar a la vez también. Solo preferencia.
prayagupd

51

Primera y simple solución (no recomendado)

  • Prueba este comando git push -f origin master.
  • Este comando sobrescribirá forzosamente el repositorio remoto (GitHub)

Solución recomendada

  • Ejecute estos comandos:
git pull --allow-unrelated-histories  //this might give you error but nothing to worry, next cmd will fix it
git add *
git commit -m "commit message"
git push

Si esto no funciona, entonces sigue 🔰

  • Eliminar .gitdirectorio de la carpeta.
  • Luego ejecute estos comandos:

    git init
    git add .
    git commit -m "First Commit"
    git remote add origin [url]
    git push -u origin master
    

O

git push -f origin master 

Úselo solo git push -f origin mastersi -uno funciona para usted.

Esto resolverá casi cualquier tipo de error que ocurra mientras empuja sus archivos.


44
¿Eliminar su repositorio de git y perder todo su historial de confirmación es una solución "Recomendada"? Parece apresurado.
Nils Guillermin

@Nils Guillermin Depende de tu situación. Si estoy trabajando en un proyecto grande donde tengo que arreglar todos los conflictos de fusión, usaría vscode para revisar y combinar todos los cambios fácilmente. Gracias por tu opinión.
Smit Patel

47

A veces olvidamos el tirón e hicimos muchos trabajos en el entorno local.

Si alguien quiere empujar sin tirar,

git push --force

está trabajando. Esto no se recomienda cuando se trabaja con otras personas, pero cuando su trabajo es algo simple o un proyecto de juguete personal, será una solución rápida.


$ git push --force origin master
shaurya uppal

2
Esto funcionó para mí: proyecto personal con otros 0 colaboradores. Había intentado varias otras "soluciones" sugeridas aquí en SO, ninguna de las cuales solucionó lo que era un problema muy simple: había hecho un reset --hardcommit local a uno más antiguo y luego hice un par más. Entonces solo quería pushpero el repositorio remoto no estaba preparado para dejarme. WarrenP en realidad podría ayudar a los aprendices de git siendo menos rúnicos. Quizás él no quiera.
Mike roedor

2
No lo use o aprenda a usarlo correctamente. Si fuerza la inserción a un repositorio central importante compartido por un equipo, debe perder todo acceso de inserción a todos los repositorios importantes. Lo que haga en su propio repositorio personal, para evitar aprender las formas alternativas, eventualmente afectará su capacidad para trabajar en repositorios compartidos. Si sabe lo que sucedió antes del empuje forzado, a veces un empuje forzado está bien. Si no lo haces, nunca está bien.
Warren P

35

Algunos de ustedes pueden estar recibiendo este error porque Git no sabe qué rama está tratando de empujar.

Si su mensaje de error también incluye

error: failed to push some refs to 'git@github.com:jkubicek/my_proj.git'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. If you did not intend to push that branch, you may want to
hint: specify branches to push or set the 'push.default' configuration
hint: variable to 'current' or 'upstream' to push only the current branch.

entonces es posible que desee seguir los prácticos consejos de Jim Kubicek, Configurar Git para empujar solo la rama actual , para establecer la rama predeterminada en actual.

git config --global push.default current

32
git pull origin branch_name --rebase

Esto funcionó para mí: el comando git pull origin branch_name --rebaseextraerá los cambios desde nombre_de_ sucursal remoto al principio, luego rebasela rama actual en la parte superior.


20

Además de las respuestas anteriores, lo siguiente funcionó para mí:

Escenario

  1. Empujé my_branch al origen con éxito.
  2. Hice algunos cambios más.
  3. Cuando intenté presionar nuevamente (después de hacer add, commit, por supuesto), recibí el error mencionado anteriormente.

Solución

 1. git checkout **my_branch**
 2. git add, commit your changes.
 3. git pull origin **my_branch** (not origin, master, or develop)
 4. git push origin **my_branch**

Prueba


1
Me has ayudado Me costó mucho notar que necesitaba pagar en otra sucursal y sacarla del control remoto, a pesar de que estaba tirando de otra rama usando la --allbandera.
MZanetti

18

Tuve el mismo problema, lo que hice fue presionarlo por primera vez usando este

git push --force

Hice esto después de que confirme los archivos y recibí un error tal como lo obtuvo. Confirmó todos los archivos y los empujó. Luego, la próxima vez que estaba empujando al github. Hice lo que me pidió y estaba bien entonces. Espero que esto funcione para usted también :)


¡Funcionará pero puede que no sea lo que quieres! Significa que básicamente estás ignorando los cambios que ahora se perderán para siempre.
rueda el

3
git push --set-upstream origin master --force
Leyendas

1
Gran manera de destruir un repositorio. Si fuerza el empuje, destruirá la historia. Además, muchas bases de códigos git configuradas profesionalmente no le permitirán hacer esto.
Oliver Dixon

Esta es una respuesta duplicada, y el original no fue un gran consejo de todos modos.
moopet el

Esto es en realidad lo que quiero hacer, pero acabo de probar con Gitlab, y Gitlab no permite esto en "ramas protegidas" por diseño
jeffery_the_wind

13

Mencioné esto en mi tutorial, Cómo usar GitHub: Un tutorial para principiantes .

Cuando crea un nuevo repositorio en GitHub, GitHub puede pedirle que cree un archivo Léame. Si crea un archivo Léame directamente en GitHub, primero deberá realizar una solicitud 'pull' antes de que la solicitud 'push' sea exitosa. Estos comandos 'extraerán' el repositorio remoto, lo fusionarán con sus archivos actuales y luego 'enviarán' todos los archivos nuevamente a GitHub:

git pull https://github.com/thomas07vt/MyFirstRepo.git master

git push https://github.com/thomas07vt/MyFirstRepo.git master

Sé que esto es un año después, pero de todas estas respuestas, la suya fue la única que realmente explicó por qué ya estaba teniendo problemas el día 1 con Github. Sin embargo, ¿cuál es la diferencia entre pull y fetch?
Xander Luciano

1
Fetch le permite buscar cambios sin fusionarlos en su sucursal local. Pull es un atajo para buscar y luego combinar. Estoy seguro de que lo descubriste en los últimos 13 meses. Solo estoy de paso porque he creado un desastre propio. ;-)
wolfhoundjesse

6

Recibí el mensaje de error mencionado anteriormente cuando intenté impulsar mi rama actual foobar:

git checkout foobar
git push origin foo

Resulta que tenía dos sucursales locales que rastreaban la misma sucursal remota:

foo -> origin/foo (some old branch)
foobar -> origin/foo (my current working branch)

Me funcionó para impulsar mi rama actual usando:

git push origin foobar:foo

... y para limpiar con git branch -d


6

nombre de sucursal de origen git push -f

Use el comando anterior solo si está seguro de que no necesita un código de sucursal remoto; de lo contrario, combine primero y luego presione el código


55
Este es un duplicado de una mala respuesta.
moopet el

5

Si no desea ingresar a su proyecto actual (y potencialmente enfrenta conflictos de fusión que no le interesa resolver) y no desea crear otra rama (Esto será tedioso para administrar otra rama), y no No quiero hacer ningún forcecomando git arriesgado y permanente (que incluso después de leer lo que hacen, a menudo me sorprenden las implicaciones de hacerlo).

Solución : simplemente arrastre el contenido de su carpeta a otra carpeta, arrastre el proyecto a su carpeta ahora vacía, arrastre el contenido extraído a la papelera y luego arrastre el proyecto correcto nuevamente a la carpeta. Debe poder empujar correctamente y obtener los resultados deseados. Literalmente me lleva menos de 10 segundos hacer esto.

A las personas que me dirían que esto no es apropiado sin citar ninguna consecuencia, o las personas que me dicen que use un comando que me cause molestias futuras, les digo: "Este método literalmente me lleva menos de 10 segundos". Si encuentro un comando git que tarda menos de 10 segundos en implementarse y tiene exactamente el mismo efecto, lo adoptaré. Hasta entonces, estoy usando este método.

Una desventaja de este método es que su historial de confirmación aparecerá lineal cuando realmente se fusionó en una rama sin documentar la fusión. Este podría no ser el mejor método cuando se trabaja con grupos. ¡Trabaja en las ramas en esos casos!


4

Simplemente tuve el mismo problema, pero en mi caso escribí la rama incorrecta en el control remoto. Entonces, parece que esa es otra fuente de este problema ... verifique que esté presionando a la rama correcta.


1
¡Y tuve una cosa similar, cuando recordé un comando anterior, que era para un repositorio completamente diferente!
Clare Macrae

4

Experimenté el mismo problema y resultó que estaba en una rama (local) diferente de lo que pensaba que estaba Y la rama local correcta estaba detrás en confirmaciones desde el control remoto.

Mi solución: pagar la rama correcta, seleccionar la confirmación de la otra rama local, git pull y git push


4

Tuve un problema similar y resultó que mi flujo de trabajo para mantener mi sucursal actualizada fue la culpa. Estaba haciendo lo siguiente:

En mi 'maestro' local

git fetch upstream
git merge upstream/master --ff-only

luego de vuelta en mi sucursal local

git rebase master

Esto funcionó bien para un flujo anterior de git pero no con github. El git rebaseproblema aquí era causar problemas con la sincronización (y admito que es algo que he tenido que aceptar sin comprenderlo completamente) y desafortunadamente me coloqué en una posición donde git push -fprobablemente se convirtió en la opción más fácil. No está bien.

Mi nuevo flujo es actualizar la rama directamente usando git mergelo siguiente:

En mi sucursal local

git fetch upstream
git merge upstream/master

Sin avance rápido, ya que habré realizado cambios, por supuesto, en la sucursal local.

Como probablemente pueda notar, no soy un experto en git, pero estoy informado de manera confiable de que este flujo de trabajo probablemente evitará los problemas específicos que tuve.


3

En mi caso, tuve "mybranch" desprotegido, y lo había hecho git pull, así que no podía entender por qué el empuje no estaba funcionando. Finalmente, me di cuenta de que estaba empujando la rama equivocada. Estaba escribiendo en git push origin masterlugar de git push origin mybranch.

Entonces, si ya lo ha hecho git pully sigue recibiendo este mensaje, asegúrese de presionar la rama correcta.


3

¿Es el nombre de su sucursal el mismo que el nombre de la sucursal remota?

De lo contrario, debe pagar una nueva sucursal con el mismo nombre que la sucursal remota e intentar presionarla nuevamente.

Suponga que la rama remota que desea empujar es [ prueba ] y su rama local se denomina [ prueba ].

Si no está en la rama de prueba , primero cambie a ella.

git checkout test

Luego abra una nueva sucursal y asígnele el nombre de prueba .

git checkout -b testing

Ahora, es hora de empujarlo:

git push [remote repo] testing

2
Solo use $git branch -M <new_name>para cambiar el nombre de la sucursal local.
com

3

He resuelto este problema en mi repositorio GIT. No es necesario rebaseo forcecomprometerse en este caso. Utilice los pasos a continuación para resolver esto:

local_barnch> git branch --set-upstream to=origin/<local_branch_name> 

local_barnch>git pull origin <local_branch_name>

local_barnch> git branch --set-upstream to=origin/master

local_barnch>git push origin <local_branch_name>

Espero que ayude.


2

Otra solución es avanzar en la cabeza del control remoto haciendo otro commit si puedes. Después de que coloque esta cabeza avanzada en el subárbol local, podrá empujar nuevamente.


2

Recibí un error similar al enviar los últimos cambios a un repositorio Git desnudo que utilizo para gitweb . En mi caso, no hice ningún cambio en el repositorio simple, así que simplemente eliminé mi repositorio simple y cloné nuevamente:

git clone --bare <source repo path> <target bare repo path>

2

Si está seguro de que nadie hizo cambios en su repositorio git y que está trabajando en la última versión, git pullno tiene sentido como una solución en su corazón ...

Entonces esto es probablemente lo que sucedió, solías git commit --amend

Le permite combinar cambios por etapas con la confirmación anterior en lugar de confirmarla como una instantánea completamente nueva. También se puede usar para editar simplemente el mensaje de confirmación anterior sin cambiar su instantánea.

Tutorial ATLASSIAN: reescribiendo el historial

Sin embargo, no se recomienda realizarlo git commit --amend si ya ha enviado el commit a GitHub , esto se debe a que "la modificación no solo altera el commit más reciente, sino que lo reemplaza por completo. Para Git, se verá como un commit nuevo". lo que significa que para otros desarrolladores en su GitHub, el historial se ve como A-> B-> C pero para usted se parece a A-> B-> D, si GitHub lo permite push, todos los demás tendrán que corregir su historial manualmente

Esta es la razón por la que recibe el mensaje de error ! [rejected] master -> master (non-fast-forward), si sabe que nadie ha realizado su último cambio, puede hacerlo git push --force, esto alterará el historial de git en su repositorio público . De lo contrario ... puede realizar git pull, pero creo que esto tendrá el mismo resultado que no realizó git commit --amend, creará una nueva confirmación (es decir: git history después de git pull: A-> B-> C-> D )

para más detalles: cómo cambiar su último commit


2

Otra opción: cambiar el nombre local de su sucursal a algo nuevo.

Entonces podrá enviarlo al repositorio remoto, por ejemplo, si esa es su forma de mantener una copia (copia de seguridad) y asegurarse de que no se pierda nada.

Puede buscar la rama remota para tener una copia local y examinar las diferencias entre (i) lo que tenía el control remoto (con el nombre de la rama anterior) y (ii) lo que tiene (con el nuevo nombre de la rama), y decidir qué hacer . Como no estaba al tanto de las diferencias del control remoto en primer lugar (de ahí el problema), simplemente fusionar o forzar cambios en algún lugar es demasiado brutal.

Mire las diferencias, elija en qué rama desea trabajar, elija los cambios que desea de la otra rama o revierta los cambios que no desea en la rama que tiene, etc.

Entonces debería estar en condiciones de decidir si desea forzar su versión limpia en el control remoto, o agregar nuevos cambios, o lo que sea.


1

El problema con el comando push es que su repositorio local y remoto no coincide. SI inicializa el archivo Léame de forma predeterminada al crear un nuevo repositorio desde git hub, entonces, la rama maestra se crea automáticamente. Sin embargo, cuando intentas empujar eso no tiene ninguna rama. no puede presionar ... Por lo tanto, la mejor práctica es crear un repositorio sin inicialización de archivo Léame predeterminado.


1

Este problema generalmente es causado por la creación de un archivo readme.md, que se cuenta como una confirmación, no está sincronizado localmente en el sistema y falta detrás de la cabeza, por lo tanto, muestra una solicitud de extracción de git. Puede intentar evitar el archivo Léame y luego intentar confirmar. Funcionó en mi caso.


0

Otra causa de este problema (aparentemente no tan común) ...

Mi servidor estaba retrasado ~ 12 horas cuando hice un empuje

Configuré NTP en el servidor SYNC mi reloj.

Ejecuté un nuevo git push que condujo al error discutido en esta publicación.



0

use git pull https://github.com/username/repository Es porque los repositorios remotos y Github no están sincronizados. Si pullusa el repositorio y Pushtodo estará sincronizado, el error desaparecerá.

``


0

git pull impresiones ya up-to-date

solución:

es posible que se haya creado un repositorio / proyecto en remoto (servidor) y se haya agregado algún archivo allí. Luego, nuevamente se creó una Carpeta en su git local e inicializado git init; este es el error , no debe crear git initen local, sino clonar el proyecto en su local utilizandogit clone

luego tirar

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.