oneline - git push tag
modificando un solo archivo en una confirmaciĆ³n pasada en git (2)
Si solo quiere modificar el segundo al último commit (por ejemplo, no hace mucho tiempo, especialmente no antes de muchas ramas y fusiones), entonces uso este procedimiento:
git checkout -b tmp bad-commit
- arreglar los archivos
-
git commit --amend
-
git rebase tmp master
Si tiene fusiones intermedias, puede intentar rebase -i -p
, pero los resultados pueden variar.
Quiero arreglar un archivo en la confirmación pasada. Esto podría afectar todas las confirmaciones ascendentes.
¿Hay una manera fácil de hacer eso? ¿Me puede dar una guía de cómo hacer eso?
Muchas veces cuando me comprometo dos veces, encuentro que he tenido un error en la primera confirmación, y deseo corregir el error sin tener que ''reiniciar'' mi última confirmación.
Para aclarar Quiero cambiar la confirmación real, es decir, quiero que se modifique el contenido de la confirmación pasada. IOW ¡Quiero cambiar la historia!
Parece que:
- una
filter-branch
(comando complejo que podría hacer lo que quieras) - y enmendar y rebase según lo descrito por jpalecek . Encontrará la misma solución un poco más detallada en esta otra pregunta relacionada .
Puede encontrar un ejemplo de rebase interactivo en este comentario : podría evitar la rama temporal, pero de nuevo, es más complejo.
También rebase a menudo para limpiar el historial de desarrollo para que los cambios sean correctos y se agrupen adecuadamente.
Un ejemplo inventado:
Renuevo la funciónfoo
a labar
y la confirmo con un comentario que dice "renombrado foo a la barra".
Luego pasé a la siguiente función o solución, y lo comprometí, y pasé al siguiente.
¡A la mitad de eso, descubrí que me perdí un ejemplo defoo
!
Confirmo mi trabajo en progreso (o uso git-stash), arreglo el ''foo'' que falta y logit-rebase --interactive
, luego usogit-rebase --interactive
para combinar todas las correccionesfoo
juntas en una confirmación limpia.
Si nogit-commit --amend
git-stash
, entoncesgit-commit --amend
(otra forma de rebase) cuando finalmente termine la función que estaba en progreso.Cuando mis parches se presionan para su revisión, todas las piezas son correctas y cuentan una historia coherente. Algunas veces uso
git-rebase --interactive
solo para hacer cambios adyacentes separados temporalmente que afectan los mismos bits, de modo que los cambios estén en contexto.