## Merge strategies ![Notes](Git%20Merge%20vs%20Rebase%20vs%20Squash%20¿Qué%20estrategia%20debemos%20elegir-.md#Notes) ## Buscar cuando un bug se introdujo Utilizar `git bisect` ## Fix messy commits Ya que estas opciones sobre escriben el historial de git, solo deben aplicarse en local y no commits publicados a un remote. ### Last commit Si solo necesitamos agregar un cambio pequeño al ultimo commit (typo o correr el formatter), podemos aplicarlo con `git commit --ammend`, se puede sobre escribir el mensaje con `-m`. ### Mutiple commits Se pueden arreglar el historial de commits con un `git rebase -i [since commit or branch]` y utilizar las estratégias de pick, squash, reword y drop. En caso de que sepamos que haremos un commit que luego no necesitaremos, podemos hacer: - `git commit --fixup [commit hash]` -> descarta el commit message de este commit y mantiene el del commit de referencia - `git commit --squash [commit hash]` -> git juntará los mensajes de todos los commits a hacer squash y el commit de referencia. Finalmente podemos hacer `git rebase -i --autosquash` y git eligirá las opciones necesarias a tomar en vez de tener que hacerlo de manera manual. ## Revertir cambios Si necesitamos _"desacer"_ los cambios introducidos en uno o multiples commits, podemos utilizar ˋgit revert --no-edit older_commit_hashˆ..newer_commit_hashˋ, donde: - git realizará un nuevo commit con los cambios contrarios por cada commit en el rango - utilizar ˋˆˋ en el ˋold_commit_hashˋ incluirá ese commit en la reversión de cambios, si no se agrega se empezará a revertir de un commit más adelante. - ˋ--no-editˋ es utilizado para que git no nos pregunte por el message de cada nuevo commit - primero debe ser el commit más antiguo, porque git creará nuevos commits en orden provisto y de hacerlo al revez aparecerán conflictos - si solo se quiere revertir un commit, se puede especificar solo ese hash y ya