Git : tips & tricks

Alexandre Garnier @zigarn

Git : tips & tricks

Une compilation de trucs et astuces pour être encore plus efficace dans votre utilisation de Git au quotidien

Checkout de la dernière branche

Vous connaissez le cd - ?

~ $ cd /tmp
/tmp $ cd -
/home/alex
~ $ cd -
/tmp
/tmp $

Et bien vous avez la même chose en Git avec le checkout :

$ git checkout master
Switched to branch 'master'

$ git checkout branch
Switched to branch 'branch'

$ git checkout -
Switched to branch 'master'

Un diff au mot à mot

 Marre d'avoir un diff indiquant un changement sur toute la ligne
-pour le changement d'un seul caractere ?
+pour le changement d'un seul caractère ?

Utilisez l'option --word-diff :

Marre d'avoir un diff indiquant un changement sur toute la ligne
pour le changement d'un seul [-caractere-]{+caractère+} ?

Ou même l'option --word-diff-regex=. :

Marre d'avoir un diff indiquant un changement sur toute la ligne
pour le changement d'un seul caract[-e-]{+è+}re ?

Diff et sauts de lignes

Une grosse astuce : toujours terminer vos fichiers par un saut de ligne.

-Dernière ligne de code.
\ No newline at end of file
+Dernière ligne de code.
+La vraie dernière ligne.
\ No newline at end of file
 Dernière ligne de code.
+La vraie dernière ligne.

Diff et espaces

Vous avez aussi les options suivantes pour éviter les différences d'espaces :

--ignore-space-at-eol
Ignore les espaces en fin de ligne
--ignore-space-change
Ignore les changements de valeurs d'espace.
Pratique pour ignorer les changements d'indentation
--ignore-all-space
Ignore tout changement d'espace

Encore du diff

diff.renames
Utilisation automatique de l'option --find-renames qui va detecter les renommages
diff.mnemonicPrefix
Utilise des préfixes avec plus de sens que 'a' et 'b' dans les chemins de fichier : 'w'=working dir, 'i'=index, 'c'=commit

Alias

De la même manière que votre shell vous permet de définir des alias, git possède un système d'alias.

$ git config --global alias.st status
$ git config --global alias.ci commit
$ git config --global alias.co checkout
$ git config --global alias.glog log \
 'log --graph --oneline --decorate --branches --tags --remotes'
$ git config --global alias.git '!git' # Commande système avec !

Un dernier pour la route ?

$ git config --global alias.lg \
"log --graph  --abbrev-commit --date=relative
 --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s
 %Cgreen(%cr) %C(bold blue)<%an>%Creset'"

Ignorer les modifs locales des fichiers traqués

Si vous avez des fichiers toujours dans votre status mais que vous ne voulez jamais commiter :

$ git update-index --skip-worktree README.md

Pour lister les fichiers dans cet état :

$ git ls-files -v | grep '^S'
S README.md

Revenir en arrière :

$ git update-index --no-skip-worktree README.md

Pour simplifier ces commandes :

[alias]
    forget = update-index --skip-worktree
    unforget = update-index --skip-worktree
    forgotten = ! git ls-files -v | grep ^S

Chercher l'erreur avec bisect

git bisect vous permet de faire une dichotomie pour trouver le commit (et donc le code) ayant provoqué un bug.

  1. Déterminer le dernier commit sans bug (par exemple la dernière version) = GOOD
  2. Écrire un test permettant de vérifier la présence du bug
  3. Lancer git bisect
    $ git bisect start HEAD GOOD
  4. Git va effectuer une dichotomie, tester alors chaque commit en lançant le test et indiquer s'il est correct avec git bisect good ou mauvais avec git bisect bad
  5. Trouver le bug dans le commit fautif

Retrouver vos commits avec reflog

Git conserve un historique de toutes vos modification du HEAD via le reflog :

$ git reflog
3568a7f HEAD@{0}: checkout: moving from branch to master
f3e305e HEAD@{1}: checkout: moving from master to branch
3568a7f HEAD@{2}: checkout: moving from branch to master
f3e305e HEAD@{3}: checkout: moving from master to branch
3568a7f HEAD@{4}: commit: 4th commit
6c68d48 HEAD@{5}: commit: fixup! 2nd commit
e8353bb HEAD@{6}: commit: 3rd commit

Très pratique pour retrouver vos anciens commits après un commit --amend ou un rebase

Filtrer vos logs

--grep 'regex'
Filtrage sur le message de commit, pour trouver les commits référençant un ticket
-G 'regex'
Filtrage sur le contenu actif du diff
--until, --since
Filtrage sur la chronologie des commits

Mais encore

Merci