¿Cómo fuerzo correctamente un envío de Git?

Resuelto Spyros asked hace 13 años • 12 respuestas

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 pushde 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 --helpobtener 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?

Spyros avatar Apr 01 '11 12:04 Spyros
Aceptado

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 -fes la abreviatura de --force, por lo que

git push origin <your_branch_name> -f

también funcionará.

Katie avatar Sep 26 '2012 21:09 Katie

Y si push --forceno 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 forcepresiones sobre un repositorio público.
  • No hagas esto ni nada que pueda dañar a alguien pull.
  • Nunca resethagas un rewritehistorial 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 --forceque 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-leaseintroducido 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 --forcees necesario, pero aún desea evitar más problemas. Me atrevería a decir que debería ser el push --forcecomportamiento 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 --pushinstancias...

¿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.

cregox avatar May 22 '2013 22:05 cregox