Pregunta ¿Cómo forzar correctamente un empuje de Git?


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

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 traté de git push desde mi repositorio local a mi repositorio remoto, pero recibí un error como:

Para evitar que pierda el historial, las actualizaciones no rápidas fueron   rechazado Combine los cambios remotos antes de volver a presionar. Ver la 'Nota   sobre la sección de avance rápido de git push --help para detalles.

Pensé que probablemente una

git push --force

obligaría a mi copia local a enviar cambios al remoto y hacerlo de la misma manera. Fuerza la actualización, pero cuando vuelvo al repositorio remoto y realizo una confirmación, noto que los archivos contienen cambios obsoletos (los que el repositorio remoto principal tenía previamente).

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

[I] intenté forzar, pero cuando volví al servidor maestro para guardar los cambios, obtengo una organización obsoleta. Por lo tanto, cuando me comprometo, los repositorios no son lo mismo. Y cuando trato de usar git push nuevamente, obtengo el mismo error.

¿Cómo puedo solucionar este problema?


908
2018-04-01 05:35


origen


Respuestas:


Solo haz:

git push origin <your_branch_name> --force

o si tiene un repositorio específico:

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

Esto eliminará su (s) compromiso (s) anterior (es) y empujará su (s) actual (es).

Puede que no sea apropiado, pero si alguien tropieza con esta página, pensó que tal vez querrían una solución simple ...

Bandera corta

También tenga en cuenta que -f es la abreviatura de --force, asi que

git push origin <your_branch_name> -f

también funcionará


1726
2017-09-26 21:31



Y si push --force no funciona lo puedes hacer push --delete. Mira 2Dakota del Norte línea 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 a la historia de un git público!

En otras palabras:

  • Nunca lo hagas force presionar en un repositorio público.
  • No hagas esto ni nada que pueda dañar a alguien pull.
  • Nunca lo hagas reset o rewrite historia en una repo alguien ya podría haber tirado.

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

Haz un revertir en su lugar.

Y siempre tenga cuidado con lo que empuja a un repositorio público. Revertir:

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, ambos HEADs de origen (del revertir y de la mal reinicio) contendrá los mismos archivos.


editar para agregar información actualizada y más argumentos alrededor push --force

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

Otro problema push --force puede traer es cuando alguien empuja algo antes que usted, pero después de que ya ha buscado. Si empujas tu fuerza rebase versión ahora lo harás reemplazar trabajo de otros.

git push --force-with-lease introducido en el git 1.8.5 (gracias a @VonC comentar sobre la pregunta) intenta abordar este problema específico. Básicamente, traerá un error y no presionará si el control remoto se modificó desde su última búsqueda.

Esto es bueno si realmente estás seguro de que push --force es necesario, pero aún quiero evitar más problemas. Me atrevería a decir que debería ser el valor predeterminado push --force comportamiento. Pero aún está lejos de ser una excusa para forzar una push. Gente que traído antes de su rebase seguirá teniendo muchos problemas, que podrían evitarse fácilmente si tuviera revertido en lugar.

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

¿Por qué alguien querría forzar empuje?

@linquize trajo un buen ejemplo de fuerza de empuje en los comentarios: informacion delicada. Ha filtrado erróneamente datos que no deberían ser enviados. Si eres lo suficientemente rápido, puedes "fijar"* al forzar un empuje hacia arriba.

* los los datos seguirán estando en el control remoto a menos que también hagas una recoger basura, o limpiarlo de alguna manera. También existe el potencial obvio para que se extienda por otros que traído ya, pero entiendes la idea.


198
2018-05-22 22:03



Antes que nada, no haría ningún cambio directamente en el repositorio "principal". Si realmente quieres tener un repositorio "principal", entonces solo debes presionarlo, nunca lo cambies directamente.

En cuanto al error que está recibiendo, ¿lo ha intentado? git pull de su repositorio local, y luego git push al repositorio principal? Lo que estás haciendo actualmente (si lo entendí bien) es forzar el empuje y luego perder tus cambios en el repositorio "principal". Primero debe fusionar los cambios localmente.


17
2018-04-01 05:42



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

git push --force origin B:C

13
2018-05-28 18:25



Realmente recomendaría a:

  • empujar solo al repositorio principal

  • asegúrese de que el repositorio principal sea repositorio desnudo, para no tener ningún problema con el árbol de trabajo repo principal que no está sincronizado con su .git base. Ver "¿Cómo impulsar un repositorio git local a otra computadora?"

  • Si tiene que hacer modificaciones en el repositorio principal (sin cifrar), clonarlo (en el servidor principal), hacer su modificación y retroceder a él

En otras palabras, mantenga un repositorio simple accesible tanto desde el servidor principal como desde la computadora local, a fin de tener un solo repo ascendente desde / hacia el cual tirar / tirar.


10
2018-04-01 05:53



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 se desactiva 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

empujar su rama a desiredOrigin y crea un RP


5
2018-05-26 21:31



usa este siguiente comando:

git push -f origin master

3
2018-04-10 14:00