2010-12-21 10 views
15

he editado un archivo y lo hicieron:¿Cómo puedo deshacer mi último git add/commit?

git add file.py 
git commit -m 'fixed bug' 

luego edité otro archivo y realicé una corrección de errores de menor importancia. No quiero dos confirmaciones, una después de otra, que muestren 'corrección de errores'. Quiero que uno se comprometa con 'correcciones de errores'.

¿Cómo puedo deshacer el último agregar/confirmar y cambiar el primer mensaje de confirmación?

yo estaba buscando en los git reset, git revert, git undo comandos pero no quiero arruinar mi repo con una conjetura

EDIT: Se encuentra la manera de hacerlo: http://www.gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html

Respuesta

26

Si ya comprometida su segundo cambio, restablezca primero:

git reset HEAD^ 

Ahora su HEAD es comprometerse en la primera, y el contenido de sus archivos locales es sin cambios.

git add <the file(s) for the second bug fix> 
git commit --amend -m'bug fixes' 

Si todo seguido y archivo cambiado son tenidas en cuenta para la segunda corrección de errores, puede ejecutar esto en su lugar, como de costumbre:

git commit -a --amend 

que modifica el commit es exactamente esto:

  • agrega los cambios en el índice a la confirmación anterior (por lo tanto, la necesidad de git add, o -a)
  • le permite c cuelgue su mensaje de compromiso

Tenga cuidado, sin embargo: si ha distribuido el primer compromiso, el repositorio de otras personas se volverá extraño. No debe cambiar una confirmación que alguien más haya obtenido.


También podría utilizar probablemente git merge --squash, que se siente más lógico, pero no necesariamente más fácil. Úselo para fusionar una rama que contenga sus dos confirmaciones, hasta la confirmación anterior.

aplastante funciona también con git rebase.

+0

Con los dos archivos I que edité, ya hice 'git add file; git commit'. Al hacer 'git --amend -m 'asd'' solo editaba mi mensaje de confirmación anterior, ¿no? ¿Dejando el primer compromiso en el registro? – dave

+0

No, '--amend' agrega el contenido del índice a la confirmación recién creada. El compromiso anterior desaparece (se convierte en colgando). Lo más probable es que aún puedas verlo en gitk, ejecutar una recarga (Ctrl + F5) en gitk para hacer que desaparezca. La confirmación colgante desaparecerá de la memoria más adelante ('git gc' debería limpiarla). – Gauthier

+0

¿Cometiste dos veces? En ese caso, puede preceder los comandos anteriores con 'git reset HEAD ^'. Haga una copia de seguridad de su repositorio antes de hacer todo esto (asegúrese de que la carpeta .git está en su copia de seguridad), no quiero ser responsable de la pérdida de datos. – Gauthier