Tengo 2 commits que no presioné:
$ git status
# On branch master
# Your branch is ahead of 'faves/master' by 2 commits.
¿Cómo puedo hacer retroceder el primero (el más antiguo), pero conservar el segundo?
$ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...
commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...
De aquí:
http://friendfeed.com/harijay/742631ff/git-question-how-do-i-rollback-commit-just-want
¿Solo necesito hacer:
git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
¿Es decir?
Respuestas:
La forma más segura y probablemente más limpia de hacerlo es volver a crear una base interactiva.
O,
Desde allí, puede aplastar las confirmaciones, que reúne una o más confirmaciones en la confirmación anterior. Para eliminar por completo una confirmación del historial, elimine la línea de la lista.
Puede revertir una confirmación con,
git revert
pero agregará más mensajes de confirmación al historial, lo que puede ser indeseable. Use el-n
parámetro para decirle a Git que no confirme la reversión de inmediato. Puede cambiar el nombre de forma interactiva y aplastarlos hasta una comisión anterior para mantener las cosas limpias.Si las dos confirmaciones con las que está trabajando aquí afectan los mismos archivos, puede ver un conflicto de fusión.
Restablecer el repositorio con
git reset --hard
debe hacerse con cuidado, ya que no se puede deshacer.La reescritura del historial debe hacerse con cuidado.
fuente
rebase
lo menos posible. Si trabajas con otros, simplemente hazlorevert
.Esto si de http://nakkaya.com/2009/09/24/git-delete-last-commit/ y funcionó para mí
fuente
No. git-reset --hard te devolverá a la historia. Lo que estás buscando es git revert, que deshacerá cualquier confirmación.
fuente
Acabo de hacer esto:
Lo arruiné así que lo hice
Luego lo hizo de nuevo. Luego tuve que empujar así:
Y destruyó los commits más nuevos que el commit al que había retrocedido. Funcionó muy bien.
fuente
No,
git reset --hard baf8d5e
eliminará el3368e1c
commit y HEAD estará en elbaf8d5e
posterior.Si desea mantener el
3368e1c
compromiso y eliminar elbad8d5e
compromiso, la solución más fácil es hacer un "git rebase -i HEAD~2
" (es decir, un rebase interactivo de los dos últimos compromisos). Este comando iniciará su editor de mensajes de confirmación y verá una línea para cada una de las últimas dos confirmaciones. Allí simplemente borra labad8d5e
línea de confirmación y guarda. git reescribirá su historial y la segunda confirmación se habrá ido.Hay otros comandos útiles que se pueden utilizar en el editor de mensajes de confirmación como
squash
,edit
, etc. rebase interactivo es muy poderoso!¡No haga esto si alguien ya vio estos commits (push o pull de su repositorio)!
fuente
En referencia al comentario de
git reset --hard
jtimberman sobre la posibilidad de deshacerse, eso no es del todo cierto. Ver aquí: https://stackoverflow.com/questions/5473/undoing-a-git-reset-hard-head1fuente
es la única forma de deshacer una confirmación si solo hay otra confirmación en el repositorio (por ejemplo, confirmación inicial y 1 más). El resto de las formas (revertir, rebase) se niegan a trabajar, al menos a partir de git 1.7.5.1.
Si sigue el comando
git reset
con a,git gc
entonces git eliminará los datos de confirmación anteriores del repositorio por completo.fuente
Eso traerá de vuelta el directorio del "árbol" dado para el / path / to / dir
fuente
Conseguí que esto funcionara editando manualmente los códigos hash de los últimos commits de los archivos HEAD dentro de la carpeta del repositorio:
Antes de eso, nunca pude impulsar para originar las operaciones UNMERGE que hice localmente. Siguió diciendo que "no pudo empujar algunas referencias" al Repositorio Central.
fuente