tipos tag remove practices etiquetas crear best git push git-push git-non-bare-repository

tag - ¿Cómo puedo forzar adecuadamente un empujón Git?



git tag best practices (7)

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

Con respecto al error que está recibiendo, ¿ha intentado git pull desde su repositorio local y luego git push al repositorio principal? Lo que estás haciendo actualmente (si lo entendí bien) es forzar el impulso y luego perder tus cambios en el repositorio "principal". Debes fusionar los cambios localmente primero.

He configurado un repositorio remoto "principal" y lo he clonado en mi computadora. Hice 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. Entonces 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 recibí un error como:

Para evitar que pierda el historial, se rechazaron las actualizaciones que no eran de avance rápido. Combine los cambios remotos antes de presionar nuevamente. Consulte la sección ''Nota sobre los adelantos rápidos'' de git push --help para obtener más información.

Pensé que probablemente un

git push --force

forzaría a mi copia local a enviar cambios al remoto y hacerlo igual. Forza la actualización , pero cuando vuelvo al repositorio remoto y hago una confirmación, me doy cuenta de que los archivos contienen cambios obsoletos (los que tenía el repositorio remoto principal anteriormente).

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

[I] intenté forzar, pero cuando volví al servidor maestro para guardar los cambios, me quedé desactualizado. Así, cuando cometo los repositorios no son los mismos. Y cuando trato de usar git push de nuevo, me sale el mismo error.

¿Cómo puedo solucionar este problema?


Esta fue nuestra solución para reemplazar el maestro en un repositorio corporativo de gitHub mientras mantenemos el historial.

push -f para 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

empuje su rama al origen desiredOrigin y cree un PR


Realmente recomendaría a:

  • empuje solo al repositorio principal

  • asegúrese de que el repositorio principal sea un repositorio simple , para que nunca tenga 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 otra computadora? "

  • Si tiene que hacer una modificación en el repositorio principal (simple), clone (en el servidor principal), haga su modificación y vuelva a pulsarlo.

En otras palabras, mantenga un repositorio al que se pueda acceder tanto desde el servidor principal como desde la computadora local, para tener un único repositorio ascendente desde / hacia el cual tirar / tirar.


Si estoy en mi sucursal local A, y quiero forzar la inserción de la sucursal local B en la sucursal de origen, CI puede usar la siguiente sintaxis:

git push --force origin B:C


Solo haz:

git push origin <your_branch_name> --force

o si tienes un repositorio específico:

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

Esto eliminará sus compromisos anteriores y empujará su actual.

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

Bandera corta

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

git push origin <your_branch_name> -f

También funcionará.


Y si push --force no funciona, puedes hacer push --delete . Mira la segunda 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 una historia pública de git!

En otras palabras:

  • Nunca force empuje en un repositorio público.
  • No hagas esto ni nada que pueda romper el pull de alguien.
  • Nunca reset o rewrite historial en un repositorio que alguien ya haya hecho.

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.

Hacer una reversa en su lugar.

Y siempre tenga cuidado con lo que empuja a un representante público . Volviendo:

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 HEAD de origen (desde la reversión y desde el reinicio del mal ) contendrán los mismos archivos.

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

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

Otro problema push --force puede presentar la push --force es cuando alguien empuja algo antes de que lo hagas, pero después de que ya hayas buscado. Si presiona para forzar su versión rediseñada ahora, reemplazará el trabajo de otros .

git push --force-with-lease introducido en git 1.8.5 ( gracias al comentario de @VonC sobre la pregunta) trata de abordar este problema específico. Básicamente, traerá un error y no se enviará si se modificó el control remoto desde su última recuperación.

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

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 confidenciales . Has filtrado erróneamente datos que no deberían ser empujados. Si eres lo suficientemente rápido, puedes "arreglarlo" forzando un empuje en la parte superior.

* Los datos 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 de que sea propagado por otras personas que ya lo habían comprado , pero entiendes la idea.


usa este siguiente comando:

git push -f origin master