Dernier épisode de la série git, c’est un peu foutrac, parcourez l’article en fonction de ce que qui vous intéresse !
On y parle des commandes utiles (alias
, suppression et nettoyage de l’historique, …), des outils graphiques et des outils pour faire des diffs et des messages de commits.
Commandes en plus
Créer des alias
git alias, alias
Certaines commandes git sont trop longues pour vous ? Utiliser les alias ! Il y a en deux types : les alias git, les alias bash.
Les alias git
Les alias git sont des commandes de type git <alias>
et qui sont associés à une autre commande git plus longue. Exemples :
git config --global alias.st status -sb
git st
Sortie :
## main...origin/main M _posts/dev/2024-08-13-git-3.md M _posts/dev/2024-08-13-git-4.md
On peut les configurer directement dans le fichier .gitconfig
qui se trouve dans votre home directory.
[alias]
st = status -sb
ol = log --oneline
graph = log --oneline --decorate --graph
graphall = log --oneline --decorate --graph --all
ac = !git add -A && git commit -m # add all and commit
discard = !git reset --hard && git clean -fd # Supprimer toutes les modifications des fichiers suivis et non-suivis depuis le dernier commit
uncommit = reset --soft HEAD^ # Supprimer le dernier commit sans supprimer les modifications
unstage = reset HEAD -- # Annuler l'ajout des fichiers dans la staging area
Les alias bash
Dans .bashrc
, on peut configurer des alias. Exemple :
alias ca='git add -A && git commit -m ' # Commit All
ca "Mon message"
Supprimer l’historique
git reset
Dans un précédent article de cette série, je présentais git revert
et vous recommandais de l’utiliser de préférence à git reset
. Cependant git reset
a son intérêt.
git reset
est une commande qui permet d’écraser l’historique. Or, s’il y a bien une chose que git n’aime pas pour le travail collaboratif, c’est modifier l’historique. Des historiques non synchronisés = problèmes assurés. N’utilisez git reset
que si vous êtes seul sur votre projet ou seul sur votre branche.
Dans l’idée, il faut toujours aller de l’avant, un rollback est une modification comme une autre qui mérite d’être conservée dans l’historique.
git reset |
git log --oneline |
Commentaire |
---|---|---|
--hard d9d039d --hard HEAD~2 |
d9d039d (HEAD -> main) First commit |
Toutes les commits et leurs modifications jusqu’à d9d039d seront effacées de l’historique |
--soft d9d039d --soft HEAD~2 |
d9d039d (HEAD -> main) First commit |
Tous les commits jusqu’à d9d039d seront effacés, les modifications sont conservées mais à recommiter. Faire un git status pour voir les fichiers à valider |
Maintenant que vous êtes devenus des boss de git, vous pouvez manipuler cette dangereuse commande qu’est git reset
!
Nettoyer l’historique
bfg, git filter-repo
bfg
repo cleaner fait du ménage pour vous dans l’historique d’un repo. Il permet les choses suivantes :
- supprimer des fichiers de taille importante ou des patterns de fichiers dans l’historique d’un repo
- remplacer des chaînes de caractères dans l’historique (pour supprimer des mots de passe, tokens malencontreusement commités)
Git a développé git filter-repo
plus récemment qui fait concurrence à bfg
. git filter-repo
a l’air très puissant mais il est plus difficile à manier et contrairement à bfg
, il ne protège pas le dernier commit.
Attention cependant ! En modifiant l’historique, un repo distant ne sera plus synchronisé. Il faudra très certainement se recaler sur la version nettoyée du repo et pousser l’intégralité de l’historique grâce à git push --force
.
Stocker des fichiers de taille importante
git lfs
git n’a pas été conçu pour stocker des fichiers de volume important ou des binaires (même si il peut le faire). Imaginons que vous ayez des fichiers de test, des images, voire des vidéos que vous souhaitez stocker dans votre repo. Alors peut-être que Git LFS peut vous aider ! Git Large File Storage est un plugin permet de gérer ces fichiers différemment :
- sur un repo local, les fichiers volumineux ne sont que des pointeurs jusqu’à ce que vous exécutiez
git lfs fetch
pour récupérer ces fichiers sur le repo distant. - sur un repo distant, les fichiers pointés par Git LFS sont stockés dans un espace disque spécifique.
J’avais commencé à l’utiliser de manière plus généralisée cependant je l’utilise de moins en moins :
- il faut installer
git lfs
sur sa machine et l’initialiser dans son repo, - il faut que le repo distant utilise un serveur ou un espace spécifique pour stocker les fichiers volumineux. Sinon ils sont simplement stockés sur les disques du repo ! Et donc git lfs est inutile. Donc l’utilisation de Git LFS dépend de la décision de l’organisation qui héberge votre repo distant.
- pas toujours facile d’avoir tout le monde sur un projet qui utilise Git LFS.
Donc mon point de vue est de ne pas utiliser git lfs
à moins que ce soit la seule solution et dans ce cas il faut être organisé entre tous les contributeurs.rices d’un projet.
git lfs doit être installé depuis ici.
Commandes en vrac
git worktree
Si j’avais su que git worktree existait plus tôt, j’aurais pu construire la tour Eiffel 3 fois au lieu de perdre mon temps dans des merges conflicts résultant d’un switch entre branches. Git worktree permet de rattacher une branche à un arbre de travail spécifiquement, c’est à dire un dossier par branche. Pour plus d’infos : Git worktree : se dénouer les branches
git stash
Commande permettant de mettre de côté des modifs, de faire des opérations de branches, puis de réappliquer les modifs.
git bisect
Permet de trouver l’origine d’un bug dans l’historique. Jamais utilisé (car je développe sans bug), le principe est le suivant : vous êtes au commit A et vous rencontrez un bug, mais vous savez que par le passé celui-ci n’existait pas notamment au commit Z. git bisect
va vous aider à faire une recherche binaire pour retrouver l’origine du bug introduit.
C’est mieux expliqué sur cette question Stack Overflow How do I use git bisect?.
Documentation
man git-<cmd>
: pour obtenir le référentiel complet des options d’une commande git.git <cmd> --help
ouvre aussi les manpagestldr git-<cmd>
: pour obtenir les options et les utilisations les plus fréquentes d’une commande git.tdlr
reste à installer mais il y a un site internet
Outils graphiques
IDEs
C’est vrai que dans ce tuto, on a utilisé uniquement des lignes de commandes. C’est important, parce que si vous voulez dépanner un repo, mieux vaut bien connaître les commandes git. Cependant à l’usage quotidien, on utilise beaucoup les IDE qui intègrent souvent git. Je pense à VSCode (ou VSCodium) ou les logiciels de la suite JetBrains (PyCharm, Intellij …).
JetBrains
J’adore les interfaces JetBrains pour la gestion git. Ce sont les plus clairs et les plus cohérentes et une suite d’interface graphique git est intégré par défaut. Jetbrains est en train de sortir Fleet qui se veut un concurrent de VSCode. J’espère que le projet va rester ouvert !
VSCode
Il faut installer des plugins :
Git History
qui permet d’avoir une vue du git log, de voir l’historique d’un fichier. C’est pratique mais assez limité comme utilisation.Git Lens
est l’extension la plus utilisée, elle est indispensable mais elle est sacrément complexe à utiliser. De nombreuses fonctionnalités sont bloquées par un accès payant (le graphe complet par exemple !)
Parcourir l’historique
J’aimerai franchement bien un outil simple qui m’aide à me balader facilement dans l’historique de manière visuelle sans que j’ai peur de casser quoi que ce soit. Les IDEs et leurs plugins ne sont pas toujours les plus prédisposés à la tâche. J’ai testé plusieurs outils alternatifs et pour l’instant, celui qui ressort c’est Sublime Merge. On espère qu’il reste gratuit !
Avec Sublime Merge, je peux :
- explorer l’historique
- sur l’ensemble du repo
- sur un fichier
- sur un dossier
- sur un fichier qui a changé de nom
- faire une recherche sur l’historique avec des critères de recherche spécifiques.
- faire des tâches de maintenance git classiques
Pas la possibilité de faire des diffs entre fichiers arbitraires cependant 😢.
Il y a plein d’autres Git GUI dispos, voici la liste la plus exhaustive.
Diffs
Faire des diffs dans git c’est clairement pas user friendly.
Avec les IDEs
Pour faire des diffs d’un fichier ou d’un dossier avec un autre commit ou une autre branche :
Outil | Actions |
---|---|
VSCode + plugin Git Lens | Clic droit sur le dossier/fichier > “Open Changes” |
JetBrains | Clic droit sur le dossier/fichier > Compare … |
Avec une UI
git diff
affiche les différences dans le terminal. Mais il est possible de voir ces diffs dans une interface graphique. Pour cela il faut remplacer git diff
par git difftool
qui va ouvrir votre éditeur de diff favori (meld, vscode, kompare etc.).
Pour configurer git difftool
:
git config --global diff.tool meld
git config --global merge.tool meld
git config --global --add difftool.prompt false
Astuce git worktree
Pour être plus libre dans les fichiers que vous voulez tester entre deux branches ou deux commits, je vous conseille d’utiliser git worktree
. Vous aurez ainsi deux versions de votre projets dans deux dossiers différents, il deviendra beaucoup plus facile d’utiliser les IDEs et les UIs pour tester les différences.
Messages de commits
Bien écrire des messages de commits, c’est essentiel. A la fois pour vous, pour se rappeler des changements qui ont été appliqués sur le repo et pour les autres contributeurs et contributrices du projet. Seulement on est bien d’accord, il n’y a rien de plus fastidieux qu’écrire un bon message de commit. Si vous parvenez à être consistant dans ce travail de journaliste, alors cela permet également de compiler beaucoup plus facilement un Changelog.
Convention commits
Il existe désormais une convention pour écrire vos commits : Spécification de la convention.
Vous pouvez vous en inspirer pour votre propre rédaction.
AI Takeover
Avec l’émergence des LLMs, il devient possible de générer automatiquement les messages de commits. C’est magique ✨ Bon après, c’est pas encore tout à fait évident à configurer.
Type de solutions | Outils |
---|---|
Solutions payantes et prêtes à l’usage | - VSCode : GitHub Copilot, Git Lens - JetBrains : AI Assistant, Github Copilot |
Solutions payantes à configurer | CLI : opencommit + Model API Key (ex: OpenAPI/Claude/Mistral) |
Solutions gratuites à configurer | CLI : opencommit + Modèle local hébergé par ollama (ex: Codestral) |
Voilà un exemple de message de commit généré avec llama3 :
Generated commit message:
——————————————————
docs(thredds-wiz.md): add restricted access information for SXT5_PREVIMER users to IOWAGA-WW3-HINDCAST and IOWAGA-WW3-FORECAST datasets on TDS3
——————————————————
Il faudrait écrire un article complet dessus. Je suis encore en train de tester !
Conclusion
J’espère que vous avez aimé ce tuto ! Je suis preneur de vos retours.
Abonnez-vous et activez la cloche pour être les premiers au courant de mes prochaines vidéos.
Ressources
- Lien vers la doc
.gitignore
- git worktree
- Learn git branching - Le Jeu
- Conférence So you think you know git ? animé par Scott Chacon. Beaucoup de bons conseils pour les très gros repos.