¿Cómo puedo forzar correctamente un Git push?


He configurado un repositorio "principal" remoto no desnudo y lo cloné en mi computadora. Realicé algunos cambios locales, actualizé mi repositorio local y devolví los cambios a mi repositorio remoto. Las cosas estaban bien hasta ese momento.

Ahora, tuve que cambiar algo en el repositorio remoto. Luego cambié algo en mi repositorio local. Me di cuenta de que el cambio al repositorio remoto no era necesario. Así que intenté git push de mi repositorio local a mi repositorio remoto, pero obtuve un error como:

Para prevenir de perder el historial, las actualizaciones no rápidas fueron rechazado Fusionar los cambios remotos antes de empujar de nuevo. Ver la ' Nota acerca de la sección de fast-forwards de git push --help para más detalles.

Pensé que probablemente un

git push --force

Forzaría a mi copia local a enviar cambios al remoto y hacer que sea lo mismo. Fuerza la actualización , pero cuando vuelvo al repositorio remoto y hago una confirmación, noto que los archivos contienen cambios obsoletos (los que el repositorio remoto principal repo previamente había).

Como mencioné en los comentarios a una de las respuestas :

[I] intentó forzar, pero al volver al servidor maestro para guardar los cambios, obtengo una puesta en escena desactualizada. Por lo tanto, cuando confirmo los repositorios no son los mismos. Y cuando intento usar git push de nuevo, obtengo el mismo error.

¿Cómo puedo solucionar este problema?

Author: Community, 2011-04-01

7 answers

Solo hazlo:

git push origin <your_branch_name> --force

O si tiene un repositorio específico:

git push https://git.... --force

Esto eliminará tu(s) confirmación (es) anterior (es) y empujará tu confirmación actual.

Puede que no sea apropiado, pero si alguien tropieza con esta página, pensó que podría querer una solución simple...

Bandera corta

También tenga en cuenta que {[3] } es la abreviatura de --force, por lo que

git push origin <your_branch_name> -f

También funcionará.

 1800
Author: Katie S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-21 13:19:08

Y si push --force no funciona, puedes hacerlo push --delete. Mira la línea 2nd en esta instancia:

git reset --hard HEAD~3  # reset current branch to 3 commits ago
git push origin master --delete  # do a very very bad bad thing
git push origin master  # regular push

Pero cuidado...

¡Nunca vuelvas atrás en un historial público de git!

En otras palabras:

  • Nunca force envíes un repositorio público.
  • No hagas esto ni nada que pueda romper el pull de alguien.
  • Nunca reset o rewrite historia en un repo alguien podría haber tirado ya.

Por supuesto hay excepciones excepcionalmente raras incluso a esta regla, pero en la mayoría de los casos no es necesario hacerlo y generará problemas a todos los demás.

Haga una reversión en su lugar.

Y siempre ten cuidado con lo que envías a un repositorio público. Reverting:

git revert -n HEAD~3..HEAD  # prepare a new commit reverting last 3 commits
git commit -m "sorry - revert last 3 commits because I was not careful"
git push origin master  # regular push

En efecto, ambas cabezas de origen (desde el revert y desde el evil reset) contendrán los mismos archivos.


Editar para añadir información actualizada y más argumentos alrededor push --force

Considere empujar la fuerza con arrendamiento en lugar de empujar, pero aún así prefiera revertir

Otro problema que push --force puede traer es cuando alguien empuja algo antes de que lo hagas, pero después de que ya hayas recuperado. Si presiona forzar su versión rebasada ahora reemplazará el trabajo de otros .

git push --force-with-lease introducido en el git 1.8.5 (gracias a @VonC comentario sobre la pregunta) trata de abordar este tema específico. Básicamente, lo hará traiga un error y no empuje si el control remoto fue modificado desde su última recuperación.

Esto es bueno si está realmente seguro de que se necesita un push --force, pero aún así quiere evitar más problemas. Me atrevería a decir que debería ser el comportamiento predeterminado push --force. Pero todavía está lejos de ser una excusa para forzar un push. Las personas que buscaron antes de su rebase todavía tendrán muchos problemas, que podrían evitarse fácilmente si se hubiera revertido en su lugar.

Y ya que estamos hablando de git --push instancias...

¿Por qué alguien querría forzar el empuje?

@linquize trajo un buen ejemplo de fuerza de empuje en los comentarios: datos sensibles. Has filtrado erróneamente datos que no deberían ser empujados. Si eres lo suficientemente rápido, puedes "arreglar"* forzando un empujón en la parte superior.

* Los datos de seguirán estando en el control remoto a menos que también haga una recolección de basura , o la limpie de alguna manera. También existe el potencial obvio para que se propague por otros que ya lo habían obtenido, pero se entiende la idea.

 203
Author: cregox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-24 15:24:25

En primer lugar, no haría ningún cambio directamente en el repositorio "principal". Si realmente quieres tener un repositorio "principal", entonces solo debes presionarlo, nunca cambiarlo directamente.

Con respecto al error que está obteniendo, ¿ha intentado git pull desde su repositorio local, y luego git push al repositorio principal? Lo que está haciendo actualmente (si lo entendí bien) es forzar el empuje y luego perder sus cambios en el repositorio "principal". Primero debe fusionar los cambios localmente.

 17
Author: ubik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-01 05:42:29

Si estoy en mi rama local A, y quiero forzar el empuje de la rama local B a la rama de origen C, puedo usar la siguiente sintaxis:

git push --force origin B:C
 13
Author: IcedDante,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-28 18:25:43

Realmente recomendaría a:

  • Empuje solo al repositorio principal

  • Asegúrese de que el repositorio principal es un repositorio desnudo , para no tener ningún problema con que el árbol de trabajo del repositorio principal no esté sincronizado con su base .git. Consulte " ¿Cómo enviar un repositorio git local a otro equipo?"

  • Si tiene que hacer una modificación en el repositorio principal (desnudo), clonarlo (en el servidor principal), hacer su modificación y volver a it

En otras palabras, mantenga un repositorio desnudo accesible tanto desde el servidor principal como desde el equipo local, para tener un único repositorio ascendente desde/hacia el que tirar/tirar.

 10
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:46

Esta fue nuestra solución para reemplazar master en un repositorio corporativo de GitHub mientras se mantiene el historial.

push -f dominar en repositorios corporativos a menudo está deshabilitado para mantener el historial de sucursales. Esta solución funcionó para nosotros.

git fetch desiredOrigin
git checkout -b master desiredOrigin/master // get origin master

git checkout currentBranch  // move to target branch
git merge -s ours master  // merge using ours over master
// vim will open for the commit message
git checkout master  // move to master
git merge currentBranch  // merge resolved changes into master

Envía tu rama a desiredOrigin y crea un PR

 5
Author: mihai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-26 21:31:51

Use el siguiente comando:

git push -f origin master
 4
Author: mustafa Elsayed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-10 14:00:18