GIT alias: pour être un bon développeur fainéant

Partager cet article

Temps estimé pour la lecture de cet article : 36 min

Dans le précédent épisode, je vous ai présenté rapidement GIT dans un exemple assez pratique mais je ne suis pas allé dans le détail sur une utilisation plus avancée. Ici, on va voir un ensemble d’alias et comment ces derniers vont pouvoir nous faciliter la vie au quotidien.

Git alias, mais qu’est-ce que c’est ?

L’alias, c’est tout simplement une feature de git qui va nous permettre de simplifier la saisie d’instructions. Si vous êtes comme moi un mordu de ligne de commande, les alias git sont un véritable gain de temps. En effet, elles permettent tout simplement de réduire la taille de la commande à saisir. On peut facilement configurer un alias pour chaque commande à l’aide de l’instruction git config ou en modifiant vous-même le fichier ~/.gitconfig.

Prenons, quelques exemples :

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

Cela signifie, par exemple qu’au lieu de taper: git commit, vous pouvez simplement écrire: git ci. Au fur et à mesure que vous utiliserez Git, vous utiliserez probablement également d’autres commandes fréquemment; n’hésitez pas à créer de nouveau alias.

Cette technique peut également nous permettre de créer nos propres commandes. Par exemple, pour facilement reset l’état d’un fichier à son état sur le dernier commit push d’une branche, il faut habituellement faire:

git unstage fileA
git reset HEAD -- fileA

Il suffit alors d’ajouter l’alias suivant :

git config --global alias.unstage 'reset HEAD --'

Il nous suffira plus qu’appeler la commande sur le fichier désiré.

Créer ses propres alias

Là où cela va vite devenir intéressant, c’est que vous allez pouvoir faire appel à des commandes bash ou/et même définir des variables (si vous avez besoin d’une petite introduction à bash, c’est par ici). Il suffira alors de commencer l’alias avec le caractère « ! ».

Pour vous montrer comment ça marche, nous allons créer un alias appelé « git alias » (alias-ception :D). Le but est simple lister les alias crées par l’utilisateur. Vous pouvez saisir la commande suivante :

git config --global alias.alias "! git config --get-regexp ^alias\. | sed -e s/^alias\.// -e s/\ /\ =\ /"

Décomposons le tout :

  • Le git config –global alias.alias, permet comme on l’a vu de définir un nouvel alias dont le nom sera alias.
  • Le git config –get-regexp permet d’obtenir la ligne correspondant à notre regex, ici la ligne doit commencer par alias.
  • Enfin, le sed permet de supprimer la première occurrence du mot alias pour conserver uniquement le nom de la commande

Maintenant, regardons quelques exemples d’alias bien pratique !

L’alias goto, où comment se déplacer entre les branches facilement

Journée de travail classique vous avez relu un peu de code sur la branche sur laquelle vous avez dernièrement travaillé mais on vous assigne un bug urgent à fixer. Ni une, ni deux, il faut reset les fichiers et checkout sur la nouvelle branche, c’est bête à dire mais un petit alias goto pourrait faire ça 😀 !

goto = “!f() { git reset --hard && git clean -fd && git checkout ${1-master}; }; f”

Donc, si vous êtes sur une branche feature-make-git-alias-article et que vous devez aller sur une branche develop, il suffira de faire:

git goto develop

Dans le détail :

  • git reset –hard, va permettre de supprimer tous les changements fait sur les fichiers locaux
  • git clean -fd, va supprimer tous les fichiers et dossiers non versionnés par git
  • git checkout ${1-master}, si aucun argument n’est fourni va checkout sur master sinon, va prendre checkout sur la branche passée en paramètre.

Un game-changer comme dirait les jeunes !

Lister les branches d’un projet git et afficher leur auteur

Bien souvent si on suit le gitflow classique, comme l’on va créer une branche par feature. Une fois une version donnée terminée, on va accumuler tout un tas de branche. Grâce à la commande git for-each-ref, on va pouvoir lister les branches et leur auteur associé, plutôt un bon alias à avoir sous le coude.

git config --global alias.list-branch "! git for-each-ref --format=' %(authorname) %09 %(refname)' --sort=authorname"

Si vous voulez avoir uniquement vos branches, il vous suffit d’utiliser grep et la commande git config :

git for-each-ref --format=' %(authorname) %09 %(refname)' --sort=authorname | grep "$(git config user.name)"

Ce qui va nous permettre d’avoir un résultat du genre :

 Ludovic Vimont 	 refs/heads/master
 Ludovic Vimont 	 refs/heads/develop
 Ludovic Vimont 	 refs/heads/feature-logger

Enfin, dans le même genre, lorsque l’on finit de développer des versions, on réalise tout un tas de merge de toutes les nouvelles branches créées. Mais, une fois les merges terminés, il faut nettoyer ses branches sinon on accumule vite tout un tas de branche inutile. Encore, une commande candidate pour un bon alias :

git branch --merged | grep -v "\*" | grep -v master | grep -v dev | xargs -n 1 git branch -d

Sommairement :

  • Bon ai-je vraiment besoin d’expliquer ce que fait le git branch –merged ? Comme son nom l’indique, il vous liste les branches déjà fusionnées dans votre branche actuelle. Ce qui est intéressant, c’est qu’il existe la commande contraire git branch –no-merged qui vous donne les branches non fusionnées.
  • L’option -v de grep permet d’inverser la recherche et ainsi ignorer le pattern préciser. On ignore donc les branches master, develop mais également toutes les branches qui n’ont pas encore été totalement fusionnées dans notre branche actuelle.
  • Enfin, le xargs va permettre de réutiliser le contenu réceptionner dans le pipe et exécuter la commande git branch -d, dessus et donc de supprimer les branches devenues désuètes.

Afficher tous les TODO d’un projet

On code, on code et au fil du temps et des années le projet va finir par accumuler des dizaines de petits commentaires avec la jolie annotation « TODO ». Pratique pour ne pas oublier certaines actions à effectuer plus tard, comme mettre à jour une librairie de test par exemple. Mais, on peut vite finir par en oublier quelque part si le projet est assez touffu. Avec l’alias qui va suivre, impossible !

Le premier alias que je vous propose s’appelle git todo, plutôt transparent, il va vous permettre de lister tous les fichiers contenant le mot-clé « TODO » ou « FIXME ». Pour ce faire on utilise l’option extended-regexp qui permet comme son nom l’indique de sélectionner une chaîne de caractères donnée et d’effectuer la recherche dans tous les fichiers versionnés par git.

git config --global alias.todo "! git grep --extended-regexp -I --line-number --break --heading --color=auto 'TODO|FIXME'"

Et je vous propose également une petite variante dont l’objectif est simple, uniquement afficher les fichiers concernés, ainsi que le nombre de TODO dans un fichier.

git config --global alias.todo-list "! git grep --extended-regexp -I --line-number --count 'TODO|FIXME'"

Renommer une branche avec GIT

Et enfin, on finit par l’alias à l’origine de cet article, il m’arrive souvent de faire une petite erreur de syntaxe lors de la création d’une branche. C’est un peu frustrant et souvent un peu rébarbatif à corriger. Il faut faire un minimum attention afin d’éviter d’écraser une branche par mégarde. Et si on évitait ça grâce à un petit alias :3.

rename = "!f() { branch_name=$(git rev-parse --abbrev-ref HEAD); git branch -m $1; git push origin $1; git push origin --delete $branch_name; }; f"

Détails, détails :

  • On commence par récupérer le nom de la branche courante dans une variable bash.
  • On renomme la branch avec le nouveau nom passé en paramètre et on push le résultat.
  • On termine, en supprimant l’ancienne branch.

L’alias en action, imaginons, j’ai une branche feature-super-ortographe, je push un commite dessus et là tristesse… Une coquille, ni une, ni deux: git rename à la rescousse.

git rename feature-super-orthographe

Je ne peux plus m’en passer personnellement.

Ma liste de git alias

Enfin, pour terminer ce court article, il ne me reste plus qu’à partager avec vous, les alias que j’utilise au quotidien !

[user] 
	email = 1ud0v1c@borntocode.fr
	name = Ludovic Vimont
[alias]
	st = status
	ci = commit
	br = branch
	bra = branch -a
	co = checkout
	df = diff
	dff = diff --name-only
	lg1 = log --graph --abbrev-commit --decorate --date=relative --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all
	lgb = log --graph --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(bold white)— %an%C(reset)%C(bold yellow)%d%C(reset)' --abbrev-commit --date=relative
	lg = !"git lg1"
	wc="shortlog -s -n"
	clb = fetch -p
	ta="ls-remote --tags origin"
	po= !"git pull origin"
	lgstat = log --color --graph --stat --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --
    rtag = "!sh -c 'set -e;git tag $2 $1; git tag -d $1;git push origin :refs/tags/$1;git push --tags' -"
	cichange="diff-tree --no-commit-id --name-only -r"
	editlast=!"git commit --amend"
	undo=!"git reset HEAD~;"
	pull-master=!"git pull origin master"
	pull-dev =! "git pull origin develop"
	rename  = "!f() { branch_name=$(git rev-parse --abbrev-ref HEAD); git branch -m $1; git push origin $1; git push origin --delete $branch_name; }; f"
[core]
	editor = vim
	quotepath = false
[status]
	showUntrackedFiles = all
	showStash = true
[pull]
	rebase = true
[color]
	ui = auto

Voici, quelques repositories ou articles qui m’ont aidé et inspiré pour cet article :

  • Petit gist sans prétention mais qui propose, un ensemble d’alias cohérent et efficace.
  • Un article bien cool de Michał Konarski avec des exemples d’utilisation/
  • On termine avec l’un des plus complets repostiory que vous allez pouvoir trouver sur github, bonne lecture.

Si, vous avez des alias à partager, il ne faut pas hésiter, montrons au monde la force des aliases et du partage :D.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.