Oct 19 2014

MAGIT: Git from Emacs

Tag: advancedoverdrive @ 3:22 pm

Hace un tiempo un amigo me pregunto como emplear diff desde emacs. Lo cierto es que en un principio pense en responderle con la utilidad M-x ediff que emacs maneja bastante bien. Sin embargo, y debido a que practicamente en todos nuestros proyectos usamos git, pense que la mejor respuesta no seria esa, sino emplear el sistema de diffs que magit provee. Asi que la solucion no era tan solo el saber como ver los diffs entre el HEAD y un fichero que se estuviese modificando, sino que pasaba por todo un conjunto de features que magit proveia y que hacia mucho mas facil no solo ver diffs, sino emplear muchas de las funcionalidades que git tenia, accesibles de manera ideal desde emacs.

Para instalar Magit, lo podemos hacer de distintas formas, ya sea mediante ELPA, Mermelade o empleando directamente el codigo del repositorio. En este caso explicare la forma recomendada por Magit, que es mediante ELPA (Emacs Lisp Package Archive), que desde Emacs 24 viene incluido por defecto en un intento de realizar instalaciones sencillas asi como actualizaciones para paquetes de Emacs Lisp.

Tan solo debemos anadir el nuevo repositorio anadiendo estas lineas a nuestro .emacs:

; Magit installation using ELPA
(require ‘package)
(add-to-list ‘package-archives
             ‘(«melpa» . «http://melpa.milkbox.net/packages/») t)

Una vez hecho esto, tan solo debemos abrir nuestro emacs, leer de nuevo el fichero de configuracion de emacs mediante M-x load-file de nuestro .emacs o bien M-x package-refresh-contents para actualizar la cache de ELPA.

Una vez hecho esto, tan solo debemos indicar a ELPA que queremos instalar magit de la siguiente forma: M-x package-install e indicarle que queremos instalar magit.

magit_from_elpa

Instalacion de magit desde ELPA

Veamos distintos ejemplos de magit y su potencia:

magit_branch_list_and_actions_over_it

Magit accediendo a distintas ramas y posibles diffs desde emacs

magit_branch_status_and_actions

Estado actual del codigo desde magit, mediante M-x magit-status, posibles acciones que se pueden realizar

magit_diff_status

Ejemplo de diffs en Magit

magit_history_log_details

Historial desde magit a nivel detallado para cada commit

magit_summary_commits_log

 Historial desde magit para commit a nivel resumen

Pero no solo eso, la potencia aqui se ve cuando se pueden combinar potencias de emacs con las de git y magit. Por ejemplo, para ver los diffs de un fichero especifico podemos emplear M-x vc-diff o bien C-x v =. Ademas podemos expandir segun nos interese los diffs mediante TAB o marcar regiones y pulsar «s» para ver ya no diffs de un fichero especifico, sino de una region concreta.

Es una pena que este video ya tenga muchos años de antiguedad, pero aqui se pueden ver algunas features de magit: http://vimeo.com/2871241

Aqui un cheat reference de magit con las funcionalidades mas importantes y sus keybindings: http://daemianmack.com/magit-cheatsheet.html#sec-7

Para mas informacion se puede visitar la web oficial de Magit: http://magit.github.io/documentation

Existen dependencias opcionales para magit, tal como stgit (similar a Quilt para patches desde/a un stack sobre git) , svn (soporte para svn-git), topgit (patch queue manager), wip (para work in progress sobre branches) o ert (automatizacion de tests).