¿Cómo fuerzo correctamente un envío de Git?
Configuré un repositorio "principal" remoto y no básico y lo cloné en mi computadora. Hice algunos cambios locales, actualicé mi repositorio local y envié los cambios a mi repositorio remoto. Las cosas iban 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 no era necesario cambiar al repositorio remoto. Así que intenté pasar 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 volver a presionar. Consulte la sección 'Nota sobre el avance rápido' para
git push --help
obtener más detalles.
Pensé que probablemente un
git push --force
obligaría a mi copia local a enviar cambios a la remota y hacerla igual. Fuerza la actualización , pero cuando vuelvo al repositorio remoto y hago una confirmación, noto que los archivos contienen cambios obsoletos (los que tenía anteriormente el repositorio remoto principal).
Como mencioné en los comentarios a una de las respuestas :
[I] Intenté forzar, pero cuando vuelvo al servidor maestro para guardar los cambios, obtengo una preparación desactualizada. Por lo tanto, cuando confirmo, los repositorios no son los mismos. Y cuando intento usar git push nuevamente, aparece el mismo error.
¿Cómo puedo solucionar este problema?
Solo haz:
git push origin <your_branch_name> --force
o si tienes un repositorio específico:
git push https://git.... --force
Esto eliminará sus confirmaciones anteriores y enviará la actual.
Puede que no sea apropiado, pero si alguien se topa con esta página y 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 hacerlo push --delete
. Mire la segunda línea en este caso:
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
presiones sobre un repositorio público. - No hagas esto ni nada que pueda dañar a alguien
pull
. - Nunca
reset
hagas unrewrite
historial en un repositorio que alguien ya haya obtenido.
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.
En su lugar, haz una reversión.
Y siempre tenga cuidado con lo que envía 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 HEAD de origen (del revert y del evil reset ) contendrán los mismos archivos.
edite para agregar información actualizada y más argumentos sobrepush --force
Considere forzar la fuerza con arrendamiento en lugar de empujar, pero aun así prefiera revertir
Otro problema push --force
que puede traer es cuando alguien empuja algo antes de que tú lo hagas, pero después ya lo has ido a buscar. Si presionas para forzar tu versión rebasada ahora, reemplazarás el trabajo de otros .
git push --force-with-lease
introducido en git 1.8.5 ( gracias al comentario de @VonC sobre la pregunta) intenta abordar este problema específico. Básicamente, generará un error y no presionará si el control remoto se modificó desde su última recuperación.
Esto es bueno si está realmente seguro de que push --force
es necesario, pero aún desea evitar más problemas. Me atrevería a decir que debería ser el push --force
comportamiento predeterminado. Pero todavía está lejos de ser una excusa para forzar una decisión push
. Las personas que buscaron antes de su rebase seguirán teniendo muchos problemas, que podrían evitarse fácilmente si hubiera revertido .
Y ya que estamos hablando de git --push
instancias...
¿Por qué alguien querría forzar el empujón?
@linquize trajo un buen ejemplo de fuerza de empuje en los comentarios: datos confidenciales . Ha filtrado por error datos que no deberían publicarse. Si eres lo suficientemente rápido, puedes "arreglarlo"*
forzando un empujón 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 la posibilidad obvia de que lo propaguen otras personas que ya lo han traído , pero ya se entiende la idea.