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
orewrite
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