Recuperar compromisos perdidos después del empuje

Podría usar algo de ayuda con una estrategia de recuperación. De alguna manera, terminamos en una position en la que uno cometió una pérdida de compromisos de 3 días. Y luego fue empujado . El autor no está seguro de si forzó el empuje o qué, pero ahora estamos en esta position. Y se han enviado aproximadamente 10 compromisos adicionales desde el "malo".

Todos los compromisos anteriores están ahí y podría rebuild todo, pero espero que Git pueda ayudarme. Supongo que podría elegir el range de compromisos entre el punto A y el punto B, pero ¿hay algo mejor? La mayoría, pero no todos, de los cambios son locales a un directory y prefiero no inspeccionarlos manualmente.

¿Cuál es el enfoque correcto aquí al recordar que todo se ha impulsado aguas arriba?

git reset --hard <one commit before the bad commit> git cherry-pick <the range of commits you've lost> git pull 

De esta forma simulas que estás en la última confirmación (con el reset ). Luego, crea nuevos commits localmente ( cherry-pick ). Ahora haces cambios (y tal vez fusionas conflictos).

Es posible que esté interesado en verificar el git reflog de git reflog sentido ascendente o local. Incluso si los commit parecen como si estuvieran perdidos, es posible que en realidad todavía estén dando vueltas en sus repositorys remotos / locales, simplemente sin un puntero de bifurcación en ellos. Sin embargo, no se quedarán así para siempre, creo que git recoge basura cada 2 semanas por defecto :

La variable de configuration opcional gc.pruneExpire controla la antigüedad de los objects sueltos sin reference antes de que se eliminen. El valor pnetworkingeterminado es "2 semanas atrás".

Puede leer más sobre cómo usar el reflog para recuperar el trabajo perdido en Pro Git §9.7: Mantenimiento y recuperación de datos .

si encuentra los commits en el reflog (o puede que también quiera searchlos en git fsck --full ), puede adjuntarles un puntero de bifurcación para "recuperarlos". A continuación, es posible que desee volver a establecer la rebase o cherry-pick nuevo las confirmaciones más recientes para poder (re) build el tree de historial de confirmaciones que desee.

git revert deshace los cambios de un commit, en un nuevo commit.