Hace un buen tiempo había encontrado un truco para ejecutar comando mas complejos usando los alias de git. Este es un sección del archivo ~/.gifconfig
donde se describen los alias disponibles por la terminal.
[alias]
sync = "!f() { git pull origin ${master:-$1} --rebase; }; f"
El truco es envolver lo que quieres en "!f() { ... }; f"
. $1
hace referencia al primera parámetro del comando ejecutado. Con git sync develop
recibimos develop
con solo git sync
se ejecuta el comando con master
. De esta forma podemos mantener sincronizado un rama con el destino haciendo rebase con un comando verificando incluso el estado de la rama remota.
La verdad que usar alias de git una vez que te acostumbras y entiendes lo que pasa por debajo te vuelve más productivo. Estaba buscando un comando similar a la hora de cambiar de ramas para no tener que buscarlas
Pero de pronto me conseguí un artículo que me mostró este comando.
git checkout “$(git branch — all | fzf | tr -d ‘[:space:]’)”
Fzf es una de las cosas mas geniales de la terminal, permite visualizar y seleccionas de una lista fácilmente. Puedes ver como se instala acá. Fzf había usado en carpetas del sistema de archivos pero no con git. Parecía una buena idea. El comando no me funciono del todo bien pero marco un senda.
git checkout “$(git branch --no-color | sed 's/^[* ]*//' | fzf)"
Esto era exactamente lo que quería, solo tenia que engancharlo con un alias de git y estaba completo. Pero con un poco de conocimiento de parámetros en bash tenemos esto:
[alias]
co = "!f() { \
if [ \"$#\" -eq 0 ]; then \
branch=$(git branch --no-color | sed 's/^[* ]*//' | fzf); \
if [ -n \"$branch\" ]; then \
git checkout \"$branch\"; \
fi; \
else \
git checkout \"$@\"; \
fi; \
}; f"
Aca podemos ver como se ve cuando ejecutamos git co
(alias de checkout
)
Ahora ejecutando git co my-branch
se ejecuta el git checkout my-branch
de toda la vida y con git co
(como en la foto) ejecuta el comando con fzf
y puede elegir entre un conjunto de ramas disponibles para rápidamente cambiar. Easy! 😏
Actualización
Revisando la configuración de fzf y de git se pudo mejorar algunas cositas. Pruébenlo
co = "!f() { \
if [ \"$#\" -eq 0 ]; then \
branch=$(git branch --no-color -v | fzf --border --height 50% | sed -E 's/^[* ]*([^ ]+).*/\\1/'); \
if [ -n \"$branch\" ]; then \
git checkout \"$branch\"; \
fi; \
else \
git checkout \"$@\"; \
fi; \
}; f"