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://myusername@bitbucket.org/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.

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.


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


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

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

10

Fuerza para empujar

git push -f maestro de origen


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.


6

Necesita ingresar:

$ git pull
$ git fetch 
$ git merge

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


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


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 :)


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


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

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


1

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

git pull --rebase

luego

git push

la mejor de las suertes


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ó :))


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.


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.


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

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.