Deshace el último impulso rápido hacia el control remoto

Sé que esta pregunta se ha hecho muchas veces. Pero mi escenario es diferente. Estoy teniendo dos twigs, maestra y desarrollo. Nunca toco la twig principal, pero erróneamente presiono toda la información en el maestro. Estaba en mi twig de desarrollo cuando ejecuto el siguiente command.

git push origin development:master 

Mis compromisos completos de desarrollo se presionan en el maestro con el command anterior. El command tiene "dos puntos" , lo que posiblemente reemplazó mi código.

Según este artículo Ref .: Por qué Git usa los dos puntos (: <twig>) para eliminar la twig remota , reemplaza el código.

¿Cómo puedo revertir esto?

Este command que usaste,

 git push origin development:master 

actualiza la twig principal en el control remoto con la twig de desarrollo localmente, o en otras palabras, hace una combinación de desarrollo rápido en la twig principal en el control remoto.

No "reemplaza" el trabajo en la twig principal , ya que no es un empuje de fuerza con las opciones --force o the -f .

Solución

Puede intentar forzar la inserción de la twig principal en el control remoto. Tenga en count que si otro usuario ya ha enviado trabajo adicional a la twig maestra, ya que lo reenvió rápidamente a la twig de desarrollo, el trabajo de ese usuario se sobreescribirá con su fuerza-empuje. Sin embargo, si ese trabajo se basa en la twig de desarrollo en lugar de maestro, entonces ya es un poco inválido, en mi opinión.

Puedes forzar el empuje usando

 git push origin master -f 

Si sientes que tienes que estar más seguro cuando empujas la fuerza para no sobre escribir el empuje de otra persona, entonces puedes usar la --force-with-lease (¿desde la versión 1.8.5 de Git?)

 git push origin master --force-with-lease 

Eso solo obligará a presionar al control remoto si la bifurcación maestra aún se encuentra en el mismo estado en que estaba cuando realizó su última inserción (el estado esperado, en function de su sucursal local de seguimiento remoto ). Tenga en count que si modifica su bifurcación de seguimiento remoto con git fetch , tendrá que pasar opciones adicionales (documentadas) para --force-with-lease para hacer esto correctamente.

Si alguien llega a empujar un nuevo trabajo antes de esto, entonces la twig maestra no estará en el "estado esperado", y el empuje de fuerza será rechazado, como una característica de security.

Por supuesto, si alguien ya recuperó sus commits empujados accidentalmente en su repository local, entonces aún podrían necesitar volver a establecer su nuevo trabajo cuando fuerce el push, si basan su nuevo trabajo en los commits accidentales.

Solución alternativa

En lugar de presionar forzosamente el estado previo de la twig maestra, puede optar por revertir las confirmaciones en caso de que no pueda forzar la twig maestra (por ejemplo, si simplemente no puede sobrescribir las nuevas confirmaciones enviadas al maestro, aunque el desarrollo se haya fusionado) por crash). Sin embargo , una vez que esté listo para fusionarse realmente en la twig de desarrollo, deberá revertir los cambios realizados en su última reversión, para restaurar los cambios completos de la twig de desarrollo en el maestro.

No entraré en los detalles de esta solución aquí, porque está bien documentada en

  • Rehaciendo una fusión revertida en Git , y

  • Cómo revertir una fusión defectuosa

git push -f origin master:master

El título de su pregunta es un poco engañoso, así que aquí está cómo deshacer la última fusión de compromiso que no le interesa en particular, si alguien se topa con esto a través de The Googles. Mira este compromiso:

Si hubiera hecho esta combinación y quisiera revertirla, lo que necesito saber es que las dos "cabeceras" (líneas de time que he combinado) enumeradas arriba, siempre comienzan con el original , el order es "mío, suyo".

Entonces, para que desaparezca, el command que quiero ejecutar es:

 git reset 05ace60 

que restablecerá mi twig a la línea de time que era justo antes de esta fusión. Si usa esto en fusiones antiguas, definitivamente perderá compromisos, solo use esto en una fusión no planificada que acaba de hacer que desea deshacer. (en un apuro, puedes hacer ese reinicio, luego git push -f origin master , pero estás en peligro inmediato de enojar a tus compañeros de trabajo si lo haces incorrectamente).