git: las actualizaciones fueron rechazadas porque el control remoto contiene trabajo que no tiene localmente

113

Estoy trabajando en un equipo con algunos desarrolladores que usan git en BitBucket. Todos estamos trabajando en una devrama, no presionando masterhasta que se publique.

Uno de los desarrolladores cometió un código incorrecto que sobrescribió el mío por accidente, y ahora estoy tratando de enviar el código correcto al repositorio. He estado leyendo sobre este error durante unos días, ya no puedo presionar al repositorio porque recibo el siguiente error:

 ! [rejected]        master -> dev (fetch first)
error: failed to push some refs to 'https://[email protected]/repo_user/repo_name.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Sigo las instrucciones y pull, pero luego recibo un conflicto de fusión. Después de ingresar un mensaje para el conflicto de fusión, mi código local ahora es el código incorrecto que el otro desarrollador cargó por accidente (como se esperaba del pull). Así que reemplazo el código incorrecto con la copia de seguridad que copié antes de realizar el envío, y cuando intento presionar nuevamente, obtengo el mismo error.

Es realmente frustrante, realmente quiero ayudar a mi equipo y contribuir, pero no puedo debido a este error. ¿Alguien sabe cómo solucionar este problema? Agradecería mucho cualquier ayuda.

Estos son los comandos que ejecuto para confirmar, si ayudan a alguien:

git pull remotename master:dev
git add --all
git commit -m "some message"
git pull remotename master:dev
git push remotename master:dev

Pensé que si mantenía este orden, no recibiría conflictos de fusión. Creo que estaba equivocado. Gracias de nuevo

Actualización: Debo agregar que he buscado durante unas horas en Google y stackoverflow, y seguí instrucciones diferentes, pero todavía no puedo pushir a la devsucursal.

delos
fuente

Respuestas:

42

git pull <remote> master:devbuscará la remote/masterrama y la fusionará en sulocal/dev rama.

git pull <remote> dev buscará el remote/dev rama y la fusionará con su rama actual.

Creo que dijiste que el compromiso conflictivo está activado remote/dev , por lo que esa es la rama que probablemente pretendías buscar y fusionar.

En ese caso, en realidad no estaba fusionando el conflicto en su sucursal local, lo cual es un poco extraño ya que dijo que vio el código incorrecto en su copia de trabajo. Es posible que desee comprobar lo que está sucediendo en remote/master.

Jeff
fuente
1
Wow ... Nunca supe eso. Pero ahora tiene mucho sentido. La rama maestra también era incorrecta, por lo que su respuesta aclara toda mi pregunta. Todavía soy un poco nuevo en git. ¡Muchas gracias por decirme la diferencia entre esos dos!
delos
6
La mejor opción para mí fue git pull --rebase.
derekmx271
152

Usa este comando en la terminal

git push -f maestro de origen

Donal
fuente
49
Usar la bandera de empuje forzado (-f) es muy peligroso y nunca debería ser parte de su flujo de trabajo regular
Spaideri
5
Votado en contra ya que me falta una advertencia en esta respuesta.
Melebius
2
¡Oh! Esto obliga al repositorio a reescribirse.
Azarsa
3
Tuve el mismo error con github y lo solucioné con este comando, @theeastcoastwest, ¿por qué dices que esto es peligroso? cuál es tu razón "
simon
3
@simon, esto es peligroso porque ignora el trabajo que está en remoto y fuerza sus cambios en el repositorio. Entonces, si no quiere estropear el trabajo de su equipo, NO fuerce el empuje.
Gásten
42

Ocurre cuando intentamos enviar al repositorio remoto pero hemos creado un nuevo archivo en el remoto que aún no se ha extraído, digamos Readme. En ese caso como dice el error

git rechaza la actualización

ya que no hemos tomado control remoto actualizado en nuestro entorno local. Así que tira primero desde el control remoto

git pull

Actualizará su repositorio local y agregará un nuevo Readmearchivo. Luego, presione los cambios actualizados al control remoto

git push origin master
Himanshu
fuente
Lo estaba haciendo git pull origin developen mi rama de desarrollo local, pero ahora, simplemente hacerlo git pullfunciona bien para mí, no sé por qué.
Alex
porque, de forma predeterminada, si su sucursal local está sincronizada con la sucursal remota y está registrado en esa sucursal, no necesita especificar una sucursal, solo git pulles suficiente
Himanshu
11

Esto suele suceder cuando el repositorio contiene algunos elementos que no se encuentran localmente. Entonces, para impulsar nuestros cambios, en este caso necesitamos integrar los cambios remotos y luego presionar.

Así que crea un tirón desde el control remoto

git pull origin master

Luego empuja los cambios a ese control remoto

git push origin master
Sravya
fuente
10

Fuerza para empujar

git push -f maestro de origen

Samir Poudel
fuente
2
Esto probablemente debería venir con una advertencia.
Chris
7

Lo arreglé, no estoy exactamente seguro de lo que hice. Intenté simplemente empujar y tirar usando:

git pull <remote> dev en vez de git pull <remote> master:dev

Espero que esto ayude a alguien si tiene el mismo problema.

delos
fuente
6

Necesita ingresar:

$ git pull
$ git fetch 
$ git merge

Si usa un git push origin master --force, tendrá un gran problema.

gaoyehua
fuente
5
¿Por qué necesita usar git fetchy git mergenuevamente manualmente después de ejecutar el git pullque los contiene ?
Melebius
6

Puedes probar esto: git pull origin master --rebase

Eduardo Ramos
fuente
2
¡Hola Eduardo! Esto funcionó para mí. Pero, ¿puedes explicar por qué funciona? ¿Qué hace exactamente este comando?
Akshaya Natarajan
4

Bueno, en realidad github es mucho más simple de lo que pensamos y absolutamente sucede cada vez que intentamos presionar incluso después de insertar explícitamente algunos archivos en nuestro repositorio de git, así que para solucionar el problema, simplemente intente ...

: git pull

y entonces..

: git push

Nota: si accidentalmente se atascó en el editor vim después de extraer su repositorio, no se preocupe, simplemente cierre el editor vim e intente presionar :)

d337
fuente
4

He hecho los siguientes pasos. finalmente está funcionando bien.

Pasos

1) git init

2) estado de git (para comprobar el estado)

3) git add. (agregue todo el archivo de cambios (.))

4) git commit -m "<pass your comment>"

5) git remoto agregar origen "<pass your project clone url>"

6) git pull --allow-no relacionadas-historias "<pass your project clone url>"maestro

7) git push -u "<pass your project clone url>"master

Prabhat
fuente
2

Tuve este error y fue porque había una actualización en el servidor, pero SourceTree no mostraba ninguna actualización disponible (posiblemente porque estaba desconectado la última vez que se verificó). Así que hice una actualización en el árbol de fuentes y ahora muestra 2 elementos para presionar en lugar de 1 elemento.

Así que asegúrese de presionar actualizar o tirar si recibe este error y luego intente nuevamente.

1,21 gigavatios
fuente
1

git pull --rebase origin master

maestro de origen de git push


git push -f maestro de origen

Advertencia git push -f origin master

  • presiona con fuerza el repositorio existente y también elimina los repositorios anteriores, por lo que si no necesita versiones anteriores, esto podría ser útil
Bhavesh Chand
fuente
1

El error posiblemente se deba a la estructura diferente del código que está confirmando y que está presente en GitHub. Puede consultar: Cómo lidiar con el error " negarse a fusionar historias no relacionadas ":

$ git pull --allow-unrelated-histories
$ git push -f origin master
Kourosh Neyestani
fuente
1

La mejor opción para mí y funciona y es simple.

git pull --rebase

luego

git push

la mejor de las suertes

Omar Abusabha
fuente
1

Así es como resolví este problema:

  1. git pull origin master
  2. git push origin master

Esto suele ocurrir cuando su sucursal remota no está actualizada. Y después de esto, si recibe un error como "Ingrese un mensaje de confirmación" Consulte esto (Para mí, la respuesta de Wang xiaohu funcionó :))

Salomi Edward
fuente
0

Primero tuve un proyecto SSDT VS. Quería impulsar el proyecto como lo tenía a Github. Quería que ese impulso fuera la versión inicial de mi repositorio comenzando la rama maestra. La sugerencia de Donal de git push -f origin master fue la forma más fácil (que vi) de lograr esto. Como no tenía que preocuparme por reescribir nada, parecía tener sentido.

cromastro
fuente
0

Yo tuve el mismo problema. Sucedió que he creado el archivo .Readme en el repositorio sin extraerlo primero.

Es posible que desee eliminar el archivo .Readme o extraerlo antes de presionar.

Martín Oputa
fuente
No estoy seguro de que esta respuesta a una pregunta de hace 5 años proporcione algún valor adicional, además de que no proporciona una solución al problema específico del OP. Dado que es un colaborador nuevo, eche un vistazo a una guía sobre cómo responder preguntas: stackoverflow.com/help/how-to-answer
Sotiris Koukios-Panopoulos
0

puedes usar

git pull --rebase <your_reponame> <your_branch>

esto ayudará en caso de que tenga algunos cambios que aún no se hayan registrado en su repositorio local. especialmenteREADME.md

descarado
fuente