Leandro López (inkel)

Alias en Git

O cómo aumentar la productividad definiendo comandos propios

Una de las mejores cosas que tiene Git es la posibilidad de definir alias de comandos, para evitar tener que escribir de manera repetitiva el mismo comando. Un ejemplo de esto son los casi típicos st, co y ci, versiones reducidas de status, checkout y commit respectivamente.

Definir un alias en Git es muy sencillo, simplemente se ejecuta:

> git config --global alias.st status
> git config --global alias.ci commit
> git config --global alias.co checkout

La sintaxis es muy simple:

En el caso de un comando simple como los del ejemplo, no es necesario más, pero supongamos que queremos hacer un alias del siguiente comando para ver todos los branches que hicimos merge en el branch actual: git branch --merged, en ese caso debemos hacer lo siguiente:

> git config --global alias.brm "branch --merged"

Las comillas son necesarias para que Git no interprete los parámetros del comando que se quiere crear el alias como parámetros de config.

La potencia de los alias no se limita solamente a ejecutar comandos propios de Git, si no que se puede utilizar para ejecutar otros comandos. Por ejemplo, supongamos que quiero usar Git para ejecutar el comando whoami(1) (un ejemplo bastante poco sensato, lo sé):

> git config --global alias.whoami "!whoami"

Con simplemente agregar ! al inicio del alias del comando el mismo se ejecutará como un comando externo a Git.

Algunos de mis alias

Yo utilizo varias alias en mi día a día. Tal vez le puedan resultar útiles a alguien.

Ver el estado de mis branches respecto a mi branch actual

Dado que trabajo con varios branches al mismo tiempo me gusta saber de cuáles ya he hecho merge y los que no:

> git config --global alias.brm "branch --merged"
> git config --global alias.brnm "banch --no-merged"
> git config --global alias.bram "branch -a --merged"
> git config --global alias.branm "branch -a --no-merged"

Ver el historial de cambios

Me gusta visualizar los cambios que se hicieron en el proyecto a manera de listado con un commit por línea, con colores y con indicación del branch de cada commit. Para eso uso varios de los parámetros del comando log:

> git config --global alias.ll "log --graph --pretty=format:'%Cblue%h%Creset -%C(yellow)%d%Creset %s - %C(yellow)%aN%Creset %Cgreen(%cr)%Creset' --abbrev-commit --date=relative"

A no asustarse por los parámetros, básicamente lo que hace es generar un listado como el siguiente:

* 091dd3d - (HEAD, git-alias) Add git alias post - Leandro López (inkel) (18 minutes ago)
* ba5633e - (origin/master, origin/HEAD, master) Change post tagline - Leandro López (inkel) (49 minutes ago)
* cb8f1dd - Update analytics code - Leandro López (inkel) (51 minutes ago)
* 4237ca0 - Change text styling/typos - Leandro López (inkel) (56 minutes ago)
* 7ed6907 - Change header font - Leandro López (inkel) (61 minutes ago)
* 0f698df - Remove projects section from index - Leandro López (inkel) (65 minutes ago)
* 5aa3244 - Remove fake & unnecessary 'about' post - Leandro López (inkel) (67 minutes ago)
* b42f67b - Remove RubyConfAR'11 badge - Leandro López (inkel) (69 minutes ago)
*   cda609b - Merge branch 'rubyconf-badge' - Leandro López (inkel) (1 year, 1 month ago)
|\  
| * 8003b24 - Add RubyConf Argentina 2011 badge - Leandro López (inkel) (1 year, 1 month ago)
|/  
* addc3c2 - Add 'git add --patch' article - Leandro López (inkel) (1 year, 3 months ago)
* d89c28b - Add substract method - Leandro López (inkel) (1 year, 3 months ago)
* 62befa9 - Add add method - Leandro López (inkel) (1 year, 3 months ago)

Dónde el SHA1 aparece en azul, el branch y autor del commit en amarillo y la fecha en verde.

También me gusta ver lo hecho hoy y el día anterior, para eso definí los siguientes alias que utilizan el mismo formato pero filtran los commit por fecha:

> git config --global alias.today "log --graph --pretty=format:'%Cblue%h%Creset -%C(yellow)%d%Creset %s - %C(yellow)%aN%Creset %Cgreen(%cr)%Creset' --abbrev-commit --date=relative --since=midnight"
> git config --global alias.yesterday "log --graph --pretty=format:'%Cblue%h%Creset -%C(yellow)%d%Creset %s - %C(yellow)%aN%Creset %Cgreen(%cr)%Creset' --abbrev-commit --date=relative --since=yesterday --until=midnight"