Git push rechazó "no avance rápido"

90

Soy bastante nuevo en gitusarlo actualmente para administrar nuestro código en un entorno de equipo. Tuve algunos problemas de rebase y los arreglé usando

git checkout --ours filename.txt
git add filename.txt
git rebase --continue

Ahora deseo presionar mis cambios y, por lo tanto, ejecuto el siguiente comando

$ git push origin feature/my_feature_branch

me da el siguiente error:

To ssh://[email protected]:7999/repo/myproject.git
 ! [rejected]        feature/my_feature_branch -> feature/my_feature_branch (non-fast-forward)
error: failed to push some refs to 'ssh://[email protected]:7999/repo/myproject.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.

¿Qué puedo hacer para eliminar el error?

PD: Estoy evitando usar la --forceopción tanto como sea posible.

Frankline
fuente

Respuestas:

76

Parece que alguien empujó nuevas confirmaciones entre tu última git fetchy git push. En este caso, debe repetir los pasos y reajustar my_feature_branchuna vez más.

git fetch
git rebase feature/my_feature_branch
git push origin feature/my_feature_branch

Después de la git fetchrecomiendo examinar la situación con gitk --all.

Boris Brodski
fuente
Qué hacer para habilitar git pull origin master: master, que debería estar predeterminado para fusionar. ¿Es esto un conflicto de fusión o no? Esta es la única pregunta que se hace.
mathtick
24

Probablemente no obtuviste los cambios remotos antes de la rebase o alguien empujó nuevos cambios (mientras estabas rebasando e intentando empujar). Pruebe estos pasos:

#fetching remote 'feature/my_feature_branch' branch to the 'tmp' local branch 
git fetch origin feature/my_feature_branch:tmp

#rebasing on local 'tmp' branch
git rebase tmp

#pushing local changes to the remote
git push origin HEAD:feature/my_feature_branch

#removing temporary created 'tmp' branch
git branch -D tmp
Ingeniero
fuente
Esto resuelve mi problema: cuando comprometí mi código, hice un rebase (demasiado tarde, ya había cambios, debería hacerlo antes de confirmar). Entonces, incluso si no hubo conflicto, no pude empujar. Después de aplicar la magia anterior, funcionó. Gracias.
Jing Li
18

¡Tuve este problema! Intenté: git fetch + git merge, ¡pero no lo resolví! Intenté: git pull, y tampoco resolví

Luego probé esto y resolví mi problema (es similar a la respuesta del ingeniero):

git fetch origin master:tmp
git rebase tmp
git push origin HEAD:master
git branch -D tmp
Aurelio A
fuente
7
Esto me jodió, empujé cosas directamente al maestro y empujé el despliegue de un día entero ... y todos están enojados ... ¡CONSEJOS INCREÍBLES!
Mike Q
6
Probablemente quiera explicar lo que está haciendo en resumen antes de darle a alguien una herramienta peligrosa.
Mirv - Matt
10

Tuve un problema similar y lo resolví con: git pull origin

William Rossier
fuente
1
Me ayudó cuando recibí el error en cuestión mientras tiraba de una rama remota.
GChuf
7

Llego tarde a la fiesta, pero encontré algunas instrucciones útiles en la página de ayuda de github y quería compartirlas aquí.

A veces, Git no puede realizar cambios en un repositorio remoto sin perder las confirmaciones. Cuando esto sucede, su empujón es rechazado.

Si otra persona ha pasado a la misma rama que usted, Git no podrá enviar sus cambios:

$ git push origin master
To https://github.com/USERNAME/REPOSITORY.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/USERNAME/REPOSITORY.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

Puede solucionar esto obteniendo y fusionando los cambios realizados en la rama remota con los cambios que ha realizado localmente:

$ git fetch origin
# Fetches updates made to an online repository
$ git merge origin YOUR_BRANCH_NAME
# Merges updates made online with your local work

O simplemente puede usar git pullpara ejecutar ambos comandos a la vez:

$ git pull origin YOUR_BRANCH_NAME
# Grabs online updates and merges them with your local work
Bilal
fuente
4

prueba este comando

$ git push -f -u origin <name of branch>

es decir $ git push -f -u origin master

ivever timothy
fuente
Eso funcionó para mi caso cuando los demás no lo hicieron. A veces solo tienes que decirle a git -f -u
gcr
1

Escribir bloqueo en el repositorio local compartido

Tuve este problema y ninguno de los consejos anteriores me ayudó. Pude recuperar todo correctamente. Pero el empujón siempre fallaba. Era un repositorio local ubicado en el directorio de Windows con varios clientes trabajando con él a través del controlador de carpeta compartida VMWare. Parecía que uno de los sistemas bloqueaba el repositorio de Git para escritura. Después de detener el sistema VMWare relevante, lo que provocó el bloqueo, todo se reparó de inmediato. Era casi imposible averiguar qué sistema causaba el error, así que tuve que detenerlos uno por uno hasta que tuviera éxito.

Boris Zinchenko
fuente
1

Bueno, utilicé el consejo aquí y me jodió, ya que fusionó mi código local directamente con el maestro. .... así que tómalo todo con un grano de sal. Mi compañero de trabajo dijo que lo siguiente ayudó a resolver el problema, necesitaba volver a asignar mi sucursal.

 git branch --set-upstream-to=origin/feature/my-current-branch feature/my-current-branch
Mike Q
fuente
0

En Eclipse, haga lo siguiente:

Repositorios GIT> Remotos> Origen> Haga clic derecho y diga buscar

Repositorios GIT> Seguimiento remoto> Seleccione su rama y diga fusionar

Vaya al proyecto, haga clic con el botón derecho en su archivo y diga Obtener desde el origen.

MansoorShaikh
fuente
0
  1. mover el código a una nueva rama - git branch -b tmp_branchyouwantmergedin
  2. cambie a la rama a la que desea fusionarse - git checkout mycoolbranch
  3. restablecer la rama a la que desea fusionar - git branch reset --hard HEAD
  4. fusionar la rama tmp en la rama deseada - git branch fusionar tmp_branchyouwantmergedin
  5. empujar al origen
Ricardo
fuente
0

Aquí hay otra solución para resolver este problema.

>git pull
>git commit -m "any meaning full message"
>git push
Sheo Dayal Singh
fuente
-1
  1. Deshaga la confirmación local. Esto solo deshará la confirmación y conservará los cambios en la copia de trabajo
git reset --soft HEAD~1
  1. Extraiga los últimos cambios
git pull
  1. Ahora puede confirmar sus cambios sobre el último código
alk453
fuente