¿Cómo puedo deshacer los malos cambios en un repository git local?

Soy nuevo en git, y me estoy encontrando con un gran problema. A saber, cómo revertir un repository a un buen estado si hago algo mal. He visto cómo usar 'git revert' para hacer cambios que deshacen los cambios anteriores, y he leído bastantes de las preguntas en stackoverflow y ubicaciones relacionadas, pero no he encontrado una manera simple de decir simplemente "poner mi local los bits de repository vuelven a ser exactamente lo que eran antes de que yo hiciera X "donde X puede ser una operación de confirmación, fusión u otra operación de repository.

Larga historia:

Esto me mordió particularmente difícil hoy cuando estaba tratando de configurar una twig de subtree para una dependencia de terceros (Jasmine) siguiendo los pasos del libro ProGit en Subtree Merging . Seguí los pasos y configuré un repository local con una twig que rastreó un repository remoto de Jasmine. Luego conecté esto usando read-tree a un subdirectory en mi proyecto y todo fue bueno. Lamentablemente, la twig Jasmine contenía una reference de submodule a una URL no pública y, cuando intenté arreglar esto, realicé los cambios (y confirmaciones) en la twig que tenía el seguimiento del repository remoto. No importa lo que hice para tratar de revertir estos commits / changes, mis commands 'git push' ya no funcionarían porque el repository pensó que tenía cambios en el código de Jasmine y estaba tratando de empujarlos a través de la URL pública que estaba rastreando .

Resumen: arruiné una parte de mi repository y no pude encontrar la manera de recuperarlo en la condición original en que estaba antes de emitir los commands causados ​​por mi estado de novato git.

¿Hay alguna forma de deshacer el repository completo de algunos commits / changes o simplemente tengo que clonarlo nuevamente y comenzar de nuevo cuando esto sucede?

Usa git-reflog

git reflog 

Encuentra la revisión a la que quieres volver

 git reset HEAD@{n} 

(reemplazando n por el número apropiado)

Tal vez git reset --hard después de eso si tienes un tree de trabajo sucio; tenga mucho cuidado ya que esos no serán restaurables)