Astuces et conseils Git
(blog.gitbutler.com)- Même les utilisateurs de Git de longue date peuvent facilement passer à côté de fonctionnalités méconnues, ce qui remet en cause l’idée que la maîtrise avancée de la ligne de commande serait généralisée
- Contrairement à la génération venue de SVN ou CVS, les développeurs ayant toujours utilisé Git ont eu moins d’occasions d’apprendre certains usages avancés
- Au fil du temps, Git a continué d’ajouter de petites fonctionnalités utiles, et ces évolutions peuvent avoir une valeur pratique dans certaines situations
- Pour les utilisateurs intermédiaires à avancés, les sujets sur les fonctionnalités anciennes mais utiles, les ajouts récents et les grands dépôts/monorepos sont répartis en une courte série en 3 volets
- Revenir sur des fonctionnalités invisibles lorsqu’on s’en tient à ses habitudes d’utilisation de Git peut aider à gérer plus efficacement le travail quotidien sur les dépôts
Pourquoi se replonger dans Git
- En préparant récemment des présentations sur Git et GitButler, l’auteur a constaté que de nombreux développeurs avaient encore des angles morts sur Git
- Autrefois, il donnait des présentations avancées sur Git, mais depuis une dizaine d’années il partait du principe que les gens connaissaient déjà les fonctionnalités avancées en ligne de commande
- La génération de développeurs qui n’a connu que Git n’a pas eu à migrer depuis des outils comme SVN ou CVS, ni à réapprendre d’anciens concepts
- Git aussi a évolué avec le temps et a acquis de nouvelles fonctionnalités ; la plupart sont discrètes ou ciblées, mais elles peuvent aider dans le travail réel
- La série de billets s’appuie sur la présentation FOSDEM 2024 little known Git stuff
Une série d’astuces Git en 3 volets
- Elle s’adresse aux utilisateurs intermédiaires à avancés de Git et couvre des fonctionnalités que même des utilisateurs chevronnés ont pu manquer
- Plutôt que de tout mettre dans un seul article, le contenu est réparti en trois billets courts, chacun centré sur quelques thèmes
- Sujets inclus :
- Oldies but Goodies : des fonctionnalités Git anciennes mais toujours utiles
- Some Subtle New Things : des changements subtils ajoutés récemment à Git
- Really Large Repositories and Monorepos : des sujets liés aux très grands dépôts et aux monorepos
- Le premier billet se poursuit avec Oldies but Goodies
1 commentaires
Avis sur Hacker News
Il dit aussi avoir eu des échanges intéressants avec les gens de Mercurial, et qu’ils obtiennent récemment des gains de vitesse impressionnants en réécrivant certaines parties internes de Hg en Rust.
Il envisage également une 3e édition de Pro Git, et invite les lecteurs à lui signaler ce qu’ils ont appris à la dure avec Git, ou ce qu’ils aimeraient savoir.
difftasticest un bon remplacement du diff de Git : https://difftastic.wilfred.me.uk/Parmi les alias
gitconfigque j’utilise souvent, il y afza,goneetroot.git fzaaffiche les fichiers modifiés/nouveaux dans une fenêtrefzf, puis passe les fichiers sélectionnés àgit add: https://github.com/junegunn/fzfgit gonesupprime les branches locales qui n’existent plus sur le distant, etgit rootaffiche la racine du dépôt, ce qui est pratique pour revenir à la racine depuis un répertoire profond. Ces temps-ci, je l’utilise moins depuis que j’utilisezoxide: https://github.com/ajeetdsouza/zoxidegit blame.https://git-scm.com/docs/git-blame#Documentation/git-blame.txt---ignore-revltrevgt
Par exemple, je ne comprenais pas pourquoi supprimer un seul commit pendant un rebase modifiait tous les commits suivants. Ce n’est qu’en réalisant que le stockage est basé sur des snapshots, mais que les opérations sont basées sur des différences, que j’ai compris le rebase. Mettre davantage l’accent sur ce point dans l’enseignement aiderait beaucoup.
Je respecte les gens qui aiment Git, mais pour moi c’est simplement un outil que je dois utiliser.
checkout/commit/pushde base, connaître quelques notions — surtout la réécriture de l’historique — peut améliorer fortement la qualité de l’historique des commits et aider les autres ingénieurs du projet à comprendre le fil des changements.Git semble être une constante appelée à durer longtemps dans l’industrie, et c’est l’un des outils que l’on manipule le plus souvent au quotidien en développement ; cela vaut donc la peine d’y regarder d’un peu plus près.
C’est pourquoi un certain niveau de complexité dans Git me paraît acceptable.
core.fsmonitor. Du point de vue des grands monorepos, j’aimerais qu’il existe une option de reprise pourgit clone.Dans les années 2000, en essayant de cloner le dépôt du noyau avec une connexion à faible bande passante, j’ai rencontré le même problème ; après avoir demandé de l’aide sur la mailing list, quelqu’un a fini par mettre tout le dépôt en tar compressé sur son site personnel, ce qui m’a permis de le récupérer.
Même aujourd’hui, si le VPN de l’entreprise se coupe brièvement, le même problème arrive parfois lors du clonage de gros dépôts. Imaginez avoir téléchargé 95 % d’un dépôt Windows de 300 Go, puis perdre le Wi-Fi un court instant.
Il est étrange que Git et Docker, les deux outils parmi les plus gourmands en bande passante dans les stacks de développement modernes, ne prennent pas correctement en charge la reprise des téléchargements.
https://git-scm.com/docs/git-bundle
C’est un peu comme vouloir un langage de bas niveau qui masque la complexité du système : les deux sont en réalité presque mutuellement exclusifs. Git est satisfaisant et pas si difficile à apprendre ; en partie, il faut simplement apprendre Git.
Il retire l’effet de boîte noire que beaucoup de développeurs ressentent dans le terminal, met le graphe au premier plan et rend les opérations de rebase visuellement naturelles, au point que Git devient amusant.
La maîtrise de la CLI reste précieuse, mais c’est frustrant de voir des développeurs avec dix ans d’expérience bloquer sur des problèmes de base, ou abîmer l’historique d’un projet parce qu’il existe cette ambiance selon laquelle « un vrai ingénieur doit utiliser uniquement la CLI Git ».
Aujourd’hui, même quand quelqu’un utilise la CLI, je lui dis de garder le graphe sous les yeux toute la journée dans une autre fenêtre. C’est possible gratuitement avec VS Code, JetBrains, et même en CLI.
quand un membre de l’équipe fusionne une PR, je le vois aussitôt et je rebase ma branche, donc elle reste toujours à jour sur la base de
main, ce qui évite l’enfer des merges et les affreux commits “fix conflicts”En cherchant les 10 fichiers les plus modifiés depuis leur création hier, je suis tombé sur https://github.com/tj/git-extras/blob/main/Commands.md
Il y a beaucoup de commandes Git supplémentaires utiles
git-extras, c’est bien. Un autre outil intéressant est git absorb : https://github.com/tummychow/git-absorbJe ne comprends pas bien pourquoi la plupart des développeurs tiennent absolument à la CLI Git, alors que des clients UI modernes comme GitKraken sont tout à fait utilisables et utiles : https://www.gitkraken.com/
Je ne suis pas totalement opposé aux GUI, mais pour l’instant la CLI est plus efficace, et je n’ai pas envie de passer du temps à chercher une GUI qui remplisse les conditions suivantes
Elle doit être agréable, être une application native et non un vieux navigateur web embarqué, ne pas avoir de télémétrie ou l’avoir désactivée par défaut, être entièrement open source, et on doit pouvoir raisonnablement s’attendre à ce qu’elle existe encore dans 5 ans
Elle ne doit pas non plus rendre les choses plus confuses. Dans une ancienne entreprise, je devais utiliser Visual Studio, et un bouton qui voulait en réalité dire “marquer le conflit comme résolu” portait l’intitulé inquiétant “Accept merge”
Il ne faut pas embrouiller les gens qui s’attendent déjà à ce qu’un mot précis ait un sens précis, et il est difficile de faire confiance à un bouton “Commit changes” qui, sous prétexte d’être serviable, pousse aussi à distance
Si je dois basculer vers un autre programme juste pour faire un commit, cela réduit ma motivation à committer souvent
push,pull,checkout, donc utiliser une GUI me semble excessifMême quand on utilise Git en CLI, la plupart du temps il ne s’agit pas de choses particulières, seulement de quelques commandes, et je note dans un fichier texte les astuces ou trucs que je n’utilise pas souvent
Je connaissais
-committerdate, mais je ne savais pas qu’on pouvait le définir comme tri par défaut, et c’est très utile. Quelques remarquesgit columnsdevient assez déroutant quand tout ne tient pas à l’écran et qu’il faut faire défiler ; ce serait bien d’avoir des numérosgit maintenancea l’air bien, mais je rebase beaucoup, donc ça m’inquiète. Je me demande si on perd les objets détachés plus vite qu’avecgc. Je vois quegcest désactivé, mais ce n’est pas clairÀ propos de
git blame, il existe un script peu connu mais utile : https://github.com/gnddev/git-blameall. Il est tellement méconnu que j’ai dû le porter moi-même vers Python 3, et je ne suis même pas développeur Pythongcest désactivé. Quand on exécute explicitementmaintenance run, il est activé comme tâcheLes objets détachés ne sont pas collectés plus vite qu’avec
gc. Au final, c’est simplement parce que cela exécute gcgit-blamealla l’air pas mal, je vais l’essayerJ’ai beaucoup simplifié mon flux Git avec quelques alias qui fonctionnent dans plusieurs environnements
git syncedsynchronise la branche actuelle par rebase avec son upstream s’il existe, sinon avec origin. Il utilisemasteroumain, avec une préférence pourmaingit pubpublie les changements sur le remote origin et utilise un force push avec leasegit prouvre l’URL de PR appropriée sur GitHub, sans nécessiter le client GH. Si un upstream est défini, la PR est envoyée vers celui-cigit hubouvre la page GitHub du dépôthttps://softwaredoug.com/blog/2022/11/09/idiot-proof-git-aliases.html
J’ai arrêté de faire semblant de savoir ce que je fais et j’utilise des outils Git visuels. Des choses comme SmartGit ou l’outil intégré à IntelliJ. Les “héros de la ligne de commande” Git me semblent surtout être dans la démonstration
La couche de commandes destinée à l’utilisateur peut être horriblement déroutante. Par exemple,
YoursetTheirspeuvent vouloir dire exactement l’inverse selon le contexteIl n’y a ni style ni thème commun à toute l’interface utilisateur, donc il faut une nouvelle couche visuelle pour éviter de rendre les gens fous
Je connais l’application et Git en général juste autant que nécessaire pour mon travail, et si j’ai rarement besoin de plus, je peux chercher. En plusieurs années d’utilisation, cela n’est arrivé qu’une ou deux fois
Même pour les opérations complexes visant à corriger les erreurs d’autres personnes ou les miennes, je commence par utiliser un outil visuel pour examiner l’historique, les commits, le reflog et les diffs, afin de comprendre ce qui s’est emmêlé et ce qui peut être récupéré
S’il n’y a qu’un commit auquel revenir, je fais un
reset --hard, et s’il faut combiner des éléments de plusieurs commits, j’utilise généralement la ligne de commandeLes deux ne sont pas mutuellement exclusifs. Pour des choses comme les diffs ou les conflits, je n’utilise que des outils visuels, mais j’ai beaucoup appris en étudiant les objets de commit, le reflog, ce que fait le rebase en coulisses, le rebase interactif, les resets hard/soft, etc.