He configurado un repositorio "principal" remoto no descubierto 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. Luego cambié algo en mi repositorio local. Me di cuenta de que no era necesario el cambio al repositorio remoto. Así que intenté git push
desde mi repositorio local a mi repositorio remoto, pero recibí un error como:
Para evitar que pierda el historial, se rechazaron las actualizaciones que no son de avance rápido. Combine los cambios remotos antes de presionar nuevamente. Consulte la sección 'Nota sobre avance rápido'
git push --help
para obtener más detalles.
Pensé que probablemente un
git push --force
obligaría a mi copia local a empujar los cambios a la remota y la haría igual. Obliga a la actualización , pero cuando vuelvo al repositorio remoto y realizo una confirmación, noto que los archivos contienen cambios desactualizados (los que el repositorio remoto principal tenía anteriormente).
Como mencioné en los comentarios a una de las respuestas :
[Intenté forzarlo, pero cuando vuelvo al servidor maestro para guardar los cambios, me quedo obsoleto. Por lo tanto, cuando confirmo los repositorios no son lo mismo. Y cuando trato de usar git push nuevamente, aparece el mismo error.
¿Cómo puedo solucionar este problema?
fuente
git push -force
más cuidado .git push --force
es de hecho otra forma válida de forzar el empuje, y empujará las ramas tan bien comogit push origin master --force
con el valor predeterminado de Gitpush.default config settings
, aunque las ramas que se empujan específicamente difieren entre las versiones de Git anteriores a 2.0 frente a 2.0.git push --force
funciona bien en estos días, FWIW ...git push --force-with-lease
funciona aún mejor :), se negará a actualizar una rama a menos que sea el estado que espera. (vea developer.atlassian.com/blog/2015/04/force-with-lease )Respuestas:
Solo haz:
o si tienes un repositorio específico:
Esto eliminará sus confirmaciones anteriores y empujará la actual.
Puede que no sea apropiado, pero si alguien se topa con esta página, pensó que podría querer una solución simple ...
Bandera corta
También tenga en cuenta que
-f
es la abreviatura de--force
, entoncesTambién funcionará.
fuente
git push origin +master
en su lugar, lo que le permite empujar múltiples especificaciones de referencia sin forzarlas a todas.git push --force
, podría terminar arruinando su rama maestra (dependiendo de su comportamiento predeterminado de inserción) ... lo que podría ser un pocogit push --force
es básicamente forzar el empuje de la rama actualmente desprotegida a su parte de contador remoto, por lo que si tiene la rama maestra desprotegida, entonces es idénticagit push origin master --force
. Será diferente si está utilizando lamatching
configuración parapush.default
, que es el valor predeterminado para las versiones de Git anteriores a 2.0.matching
empuja todas las sucursales locales a las remotas que tienen el mismo nombre, por lo que forzar el empuje definitivamente no podría ser lo que quieres hacer ...git push origin master --force
es.merge -s ours
trabajó para míY si
push --force
no funciona puedes hacerlopush --delete
. Mire la 2ª línea en esta instancia:Pero cuidado...
¡Nunca vuelvas a una historia pública de git!
En otras palabras:
force
empujes un repositorio público.pull
.reset
o larewrite
historia en un repositorio que alguien ya podría haber 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 para todos los demás.
Haz una reversión en su lugar.
Y siempre tenga cuidado con lo que empuja a un repositorio público . Revertir:
En efecto, ambos HEADs de origen (del reversión y desde el reinicio del mal ) contendrán los mismos archivos.
editar para agregar información actualizada y más argumentos sobre
push --force
Considere empujar la fuerza con arrendamiento en lugar de empujar, pero aún así prefiere revertir
Otro problema que
push --force
puede traer es cuando alguien empuja algo antes que tú, pero después de que ya hayas ido. Si presiona forzar su versión reforzada ahora lo hará reemplazará el trabajo de otros .git push --force-with-lease
introducido en el git 1.8.5 ( gracias al comentario de @VonC sobre la pregunta) intenta abordar este problema específico. Básicamente, traerá un error y no empujará si el control remoto fue modificado desde su última búsqueda.Esto es bueno si está realmente seguro de que
push --force
se necesita, pero aún así quiere evitar más problemas. Me atrevería a decir que debería ser elpush --force
comportamiento predeterminado . Pero aún está lejos de ser una excusa para forzar apush
. Las personas que buscaron antes de tu rebase todavía tendrán muchos problemas, que podrían evitarse fácilmente si hubieras revertido en su lugar.Y como 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 . Ha filtrado información erróneamente que no debe ser enviada. 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 el potencial obvio de que otros usuarios ya lo hayan contagiado , pero se entiende la idea.fuente
git push origin master --delete # do a very very bad bad thing git push origin master # regular push
Esto realmente resolvió mi problema perfectamente (en un repositorio solo con mi amigo y yo). tal vez esté mal para repositorios públicos pero para uno privado esto es un salvavidas.En primer lugar, no haría ningún cambio directamente en el repositorio "principal". Si realmente quieres tener un repositorio "principal", entonces solo debes presionarlo, nunca cambiarlo directamente.
Con respecto al error que está recibiendo, ¿ha intentado
git pull
desde su repositorio local y luegogit push
al repositorio principal? Lo que está haciendo actualmente (si lo entendí bien) es forzar el empuje y luego perder sus cambios en el repositorio "principal". Debe fusionar los cambios localmente primero.fuente
git push -f
, use , pero si cambia su repositorio principal nuevamente, debe volver a su repositorio local ygit pull
, para que se sincronice con los últimos cambios. Entonces puedes hacer tu trabajo y presionar de nuevo. Si sigue este flujo de trabajo "push-pull", no obtendrá el tipo de error del que se quejaba.Si estoy en mi rama local A, y quiero forzar el empuje de la rama local B a la rama de origen CI, puedo usar la siguiente sintaxis:
fuente
git push --force origin B:C
. En mi caso, parece quegit push --force origin C
solo pasará del maestro local a la rama C remota, independientemente de la rama en la que esté actualmente.git version 2.3.8 (Apple Git-58)
use este siguiente comando:
fuente
-f
bandera ...Realmente recomendaría:
empujar solo al repositorio principal
asegúrese de que el repositorio principal sea un repositorio simple , para nunca tener ningún problema con el árbol de trabajo del repositorio principal que no esté sincronizado con su
.git
base. Consulte " ¿Cómo enviar un repositorio git local a otra computadora? "Si tiene que hacer modificaciones en el repositorio principal (desnudo), clónelo (en el servidor principal), realice su modificación y vuelva a presionarlo
En otras palabras, mantenga un repositorio desnudo accesible tanto desde el servidor principal como desde la computadora local, para tener un único repositorio ascendente desde / hacia el cual extraer / extraer.
fuente
Esta fue nuestra solución para reemplazar master en un repositorio corporativo de gitHub mientras se mantenía el historial.
push -f
dominar en repositorios corporativos a menudo está deshabilitado para mantener el historial de la sucursal. Esta solución funcionó para nosotros.empuja tu rama hacia
desiredOrigin
y crea un PRfuente
Tenía la misma pregunta, pero finalmente lo descubrí. Lo más probable es que necesite ejecutar los siguientes dos comandos git (reemplazando el hash con el número de revisión git commit):
fuente