Fabien ROZAR
Développeur web chevronné
Fabien ROZAR
fabien.rozar@gmail.com
Comment développer à plusieurs sans gestionnaire de version ?
Qui a déjà utilisé git ?
Qui utilise le système d'exploitation Linux ?
Animation en 2 étapes :
(20 min)
Objectif : identifier les fonctionnalités essentielles d'un gestionnaire de version et de distinguer le rôle de git et github
Git est un logiciel de versionning de code, aussi appelé Source Code Management, décentralisé.
I'm an egotistical bastard, and I name all my projects after myself. First 'Linux', now 'git'.
publiée en 2007, 4M de vues (10/2023)
Certains contributeurs utilisaient des tarball et patches.
Étude des Source Control Management (SCM) disponibles pour le travail collaboratif.
Exemple de SCM :
Bilan :
I can write something better than anything else out there in 2 weeks, and I was right.
Contexte de développement du noyau Linux :
Linus cherchait une alternative à BitKeeper : sans succès.
Les implications de l'aspect distribué :
Source : Ubuntu 24.10 - 01/2025
git est le SCM dominant :
Paradoxalement, beaucoup de gens l'utilisent uniquement comme un dropbox.
Our developer survey found 93% of developers use Git.
GitHub est une plateforme de développement collaboratif en ligne qui se base sur git.
publiée en 2008, 1.5K de vues (01/2025)
Microsoft a racheté GitHub en 2018.
Démonstration d'un exemple de contribution à 1 dépôt grâce à la fonctionnalité de Fork et PR de GitHub. GitHub est :
Histoire des gestionnaires de version (SCM)
Des commandes avancés de git
git existe depuis 2005, développé pour les besoins du noyau Linux. Les agents IA n'existaient pas à l'époque, l'usage de messageries instannées (Teams, Discord, Slack...) non plus.
Il existe des alternatives qui explorent d'autres workflow afin d'améliorer le travail collaboratif, en tenant compte des agents IA.
Pour ne citer qu'une seule alternative, l'éditeur Zed.
publiée en 2025, 36K de vues (08/2025)
git
Extension : Git Graph : mhutchie.git-graph
Exemple d'identifiant d'une extension
Windows :
Linux :
sudo apt install git
VSCode
Commit/Local
Branche
Config
add
mv
rm
diff
commit
cherry-pick
status
log
stash
reset
blame
restore
branch
checkout
merge
rebase
switch
tag
remote
config
init
Synchronisation
clone
fetch
pull
push
git status permet de voir l'état des fichiers dans le dossiers qui contient le dépôt.
L'état Stage correspond à la salle d'attente du commit. C'est dans le Stage qu'on accumule les changements pour un commit à apporter au dépôt.
Remarque : on peut voir le Stage comme la salle d'attente
Zut, le dernier commit ne correspond pas aux modifications désirés : vous devez le modifier !
A retenir :
- vous pouvez modifier un commit avec l'option "--amend"
Remarque :
Ici, la modification d'un commit s'est faite sur un commit qui n'était pas propagé sur un dépôt distant !
Question : Combien de commit il y a-t-il dans ce dépôt ?
Il est plus pratique de voir les commits réalisés dans un dépôt à l'aide d'outil graphique, dans notre cas, l'extension git-graph de VSCode.
1. Vous avez manipulé les commandes suivantes :
2. Vous savez travaillé sur 1 dépôt local sur 1 branche
3. Vous savez ajouter des modifications dans un dépôt : ajout, modification et suppression de fichier
4. Vous connaissez les différents états d'un fichier
5. La branche par défaut d'un dépôt s'appelle "main"
6. Vous savez consulter l'aide des commandes git
7. Vous pouvez visualiser l'historique des commits avec git-graph
Un commit permet :
- d'ajouter un fichier
- de modifier un fichier
- de supprimer un fichier
Un commit, c'est l'unique moyen d'apporter des modifications à un dépôt git. C'est la brique élémentaire de l'outil git.
Les propriétés d'un commit :
- "stoque les différences" entre lui-même et le commit précédent;
- est créé sur un ordinateur de développeur, localement;
- est une "photographie" du dépôt dans un état donné;
- peut avoir 0, 1 ou 2 commits parents;
- est identifié par un hash, SHA1.
Pour qu'1 commit soit visible par d'autres développeurs, il faut qu'il soit accessible sur un serveur git, un dépôt git accessible en distanciel.
A retenir :
- le SHA1 est l'identifiant associé à un commit
- vous pouvez vous déplacer dans l'historique des commits :
les commits sont des "photographies" de l'état d'un dépôt !
A retenir :
- une fois qu'un fichier est ajouté à un dépôt, il est très difficile de le supprimer du dépôt
La référence "HEAD" nous permet de savoir où nous sommes dans l'historique des commits. C'est le "vous êtes ici" sur une carte. Après le premier commit, la référence "HEAD" est toujours quelque part dans l'historique des commits : elle référence toujours un commit.
A retenir :
- "git switch" est conçu pour se déplacer de branche en branche, contrairement à "git chechout"
Lorsque vous utilisez la commande "git checkout" sur un SHA1, la référence "HEAD" n'est plus attachée à une branche.
A retenir :
Vous ne pouvez pas avoir de modifications en cours lorsque vous vous déplacez dans l'historique.
La commande checkout a plusieurs usages :
- se déplacer dans l'historique des commits
- restorer l'espace de travail à l'état du commit courant
Le fait que la commande "git checkout" ait plusieurs usages ne simplifie pas la prise en main.
A retenir :
Avec les commandes "git switch" et "git restore", l'usage de "git checkout" est plus rare.
A retenir :
- vous pouvez déplacer une branche uniquement si vous n'êtes pas sur la branche
Les branches dans git sont des étiquettes dans l'historique de commit : on peut déplacer une branche !
Que voyez vous dans git-graph ?
A retenir :
- le déplacement de branche peut conduire à la perte de commits
Lors de la création d'un nouveau dépôt avec "git init", un dossier ".git" est créé à la racine du dépôt.
C'est ce dossier qui permet à git de fonctionner. On peut dire que c'est la base de données de git. Il y stocke :
- la configuration locale du dépôt;
- les refs vers les dépôt distants;
- les objets git qui représentent des commits, des dossiers ou des fichiers;
- les hooks.
Si vous souhaitez savoir ce qui se trouve dans le dossier .git, vous trouverez une bonne introduction dans l'article Git from the Bottom Up.
Attention :
Ces manipulations sont non-standards !
Elles sont exposées dans un but pédagogique. Vous ne devriez pas en arrivé là !
1. Vous avez manipulé les commandes suivantes :
2. Vous pouvez vous déplacer sur les différents commits d'un dépôt
3. La référence HEAD stoque votre position dans l'historique des commits, sur une branche ou non
4. La commande "git checkout" a plusieurs cas d'usage et a mené à l'introduction d'autres commandes, comme "git switch" ou "git restore"
5. On peut déplacer une branche uniquement si on n'est pas sur celle-ci
6. Le déplacement de branche peut entrainer la perte de commits
7. Le dossier ".git" est la base de données de git
Les fonctionnalités essentielles des dépôts distants sont :
Les clés SSH sont une paire de clé publique/clé privée.
La plateforme Github utilise votre clé publique pour vous authentifier : c'est votre clé SSH qui vous permet de faire des modification sur vos dépôt.
A retenir :
- généralement, un dépôt distant est configuré pour un dépôt local, mais ce n'est pas une obligation
Question :
A quelle étape de l' "Atelier 1" est-ce que "git push" vous retourne un message d'erreur ?
Indice : au moment du amend pour modifier un commit, vous devriez quelque chose de curieux dans le git-graph
Lorsque vous tentez de pousser vos modifications, vous devriez avoir un message d'erreur similaire :
git indique qu'il y a une divergence et propose de faire un "git pull" pour récupérer les modifications de "la branche distante". MAIS ce n'est pas ce qu'on souhaite ici. On veut mettre à jour le dépôt distant avec l'état de notre branche "main" locale.
Branche sur un dépôt distant
Référence locale d'une branche distante
Branche locale
Les branches distante et local "master" ont évolué, mais localement la référence "origin/master" n'a pas bougé
"git fetch" permet de mettre à jour les références locales
Il y a 3 moyens pour résoudre une divergence :
- "git push -f" : réserver au cas où vous êtes seul à travailler sur la branche divergente
- "git merge" : fusion des développement, peut engendrer des conflits à résoudre
- "git rebase" : réapplication des commits, peut engendrer des conflits à résoudre
1. Les commandes git découvertes dans cet atelier :
2. Vous savez travaillé sur 1 dépôt distant sur 1 branche
3. Sur Github, le contenu fichier README.md à la racine d'un dépôt est affiché sur sa page d'accueil
3. Vous savez identifier une divergence de branche
4. La commande "git push" permet de mettre à jour une branche distante
5. La commande "git fetch" permet de mettre à jour les références locales de branches distantes
1 machine avec git, 1 connexion internet, profil dév
Immersion dans le développement collaboratif avec la mise à jour d'un fichier texte.
Au besoin, pour partager des informations simplement, vous pouvez utiliser un chat en ligne.
Mieux collaborer grâce aux branches.
Les branches git peuvent être vues comme des étiquettes que l'on place dans l'historique de commits.
Mieux mettre à jour un fichier texte grâce aux les branches git (et leur résolution de conflit 😉)
Ce workshop vous permettra d'utiliser la commande "git merge" pour mettre merger une branche dans une autre.
Lorsque vous utilisez un dépôt Github, les merges sur la branche main ne se font généralement pas en local. Github permet d'outil des Pull Request, ce qui permet aussi de faire de la revue de code.
Mieux mettre à jour un fichier texte grâce aux Pull Requests.
L'utilisation de "git merge" pour :
peut rendre l'interprétation de l'historique des commits compliquée.
Pour pallier à cette difficulté, il est possible d'utiliser "git rebase" pour linéariser en partie l'historique des commits.
Relève de la politique de développement, de l'équipe de développement.
Pro du merge : commande simple, génère généralement moins de conflit.
Con du merge : créer un historique qui peut être compliqué à relire.
Pro du rebase : simplifie l'historique.
Con du rebase : si une branche est déjà partager, il est déconseillé de faire des rebases. Sous entendu, le rebase est licite uniquement sur des branches locales.
Une branche qui dure 2 jours, c'est parfait.
Si elle peut être plus courte, c'est mieux encore.
Jongler avec les commits :
Configurer plusieurs remotes.
Lorsque vous travaillez depuis un fork, vous aurez besoin de récupérer les mise à jour qui sont faites depuis le dépôt parent de votre fork.
Sur un des dépôts précédents, configurez le dépôt à partir duquel vous avez le fork comme un dépôt distant. Donnez lui le nom "official" pour le distinguer de votre remote actuel, "origin".
Pour comparer l'état d'un projet à différents points de l'historique des commits, il est nécessaire d'avoir un outil externe qui permet de comparer des dossier.
J'utilise l'outil meld pour se faire et la commande suivante :
Il est nécessaire de configurer correctement l'environnement git pour qu'il utilise le bon outil de comparaison.
Quand vous ajoutez un commit sans l'option "-m", il y a un éditeur par défaut qui apparaît (nano, vim, etc...). Pour changer l'éditeur par défaut, vous pouvez ajuster la variable d'environnement GIT_EDITOR.
Ex : export GIT_EDITOR=gedit
Lorsque que vous êtes sur la page d'un dépôt Github, si vous appuyez sur ".", cela ouvre une version en ligne de VSCode dans le navigateur.
Ca peut être pratique pour explorer plus rapidement et simplement un projet sans devoir le cloner.
Le terminal "zsh" avec l'extension "oh-my-zsh" installe par défaut une quantité d'alias pour git. Vous pouvez les consulter avec la commande :
alias | grep git
Si vous n'avez pas "oh-my-zsh" d'installer, vous pouvez consulter les alias dans leur dépôt.
Vous pouvez aussi définir vos alias dans votre fichier de configuration git :
cat ~/.gitconfig
[user]
email = fabien.rozar@gmail.com
name = frozar
[alias]
lg = "log --graph --pretty=format:'%C(#ff0000)%h -%C(#00ffff bold)%d%Creset %C(#eeeeff)%s %C(#00dd22)(%cr) %C(bold blue)<%an>' --abbrev-commit --date=relative"
[...]
Pour pouvoir faire des commit, git exige que vous ayez votre username et email configuré localement sur votre machine.
Les configurations git sont hiérarchisées dans 3 fichiers de configuration :
- local au dépôt ".git/config", git config --local
- pour un utilisateur "~/.gitconfig", git config --global
- pour le system "/etc/gitconfig", git config --system.
Pour lister les configurations pour un dépôt : git config -l
A faire :
Le fichier .gitignore permet de configurer les fichiers/dossiers qu'on souhaite ignorer dans le dépôt.
A faire :
La popularité de git à mener à le construction de jeu interactif pour apprendre à l'utiliser. La notion de branche est une des première notion difficile à appréhender de git.
A faire :
Réaliser les 2 premiers niveaux de "Introduction Sequence" de "Learn Git Branching"
Pour se retrouver rapidement lorsque vous lisez l'historique de commits d'un dépôt, les descriptions des commits sont très utiles.
Dépendant des dépôts, des conventions peuvent être mise en place.
A faire :
Lire cet article pour s'imprégner d'une façon de faire.
git est intégrer par défaut à VSCode.
A faire :
Reprenez le workshop 0 et faite un commit en utilisant l'intégration de git dans VSCode.
La description du commit devra avoir un sujet et un corps de message.
L'extension git graph ne sert pas uniquement à visualiser l'historique de commits. Il permet, entre autres, de se déplacer de l'historique de commits avec un checkout, de créer des branches, de merger une branche dans une autre, de faire des rebases, etc...
A faire :
Reprenez le workshop 1 :
L'intégration continue, ou Continuous Integration (CI), et la livraison continue, ou Continuous Delivery (CD) font maintenant partie des pratiques du développement logiciel.
L'intégration continue consiste à mettre en place des tests automatisés dans un dépôt.
La livraison continue consiste à mettre en place des mise à jour automisées de fichiers binaires ou le déploiement d'une application web en fonction de la réussite de l'étape d'intégration continue.
Cela permet d'assurer la qualité du logiciel et de réduire le temps entre le développement de fonctionnalité et leur utilisation par les clients.
Sur Github, les Github Actions permettent, à travers des fichiers de configurations dans le dépôt, de mettre en place ces pratiques.
Depuis janvier 2024, Github propose des certifications par rapport à l'utilisation de sa plateforme.
La 1ère étape consiste à mettre en place 1 worflow avec 1 job.
A faire :
La 2ième étape consiste à découvrir comment configurer plusieurs jobs dans un workflow. Les jobs peuvent s'exécuter en parallèle ou en série s'ils dépendent les uns des autres.
A faire :
Vous savez maintenant mettre un place un workflow sur un dépôt Github.
A faire :
Source : Page 62 de Git going with DVCS
Source : Page 97 de Git going with DVCS
Beaucoup de choix possibles pour le modèles de développement d'un projet :
- faire une branche par feature,
- faire une branche par équipe,
- faire une branche par personne,
- utiliser uniquement des merges, ou uniquement des rebase,
- créer des tags pour identifier des releases,
- utiliser des forks pour développement donc un fork par personne,
- etc
Il est parfois utile d'avoir un affiche de la commande "git log" qui soit plus visuellement simple à interpréter.
Vous pouvez définir un alias à cet effet :
git config --global alias.lg "log --graph --pretty=format:'%C(#ff0000)%h -%C(#00ffff bold)%d%Creset %C(#eeeeff)%s %C(#00dd22)(%cr) %C(bold blue)<%an>' --abbrev-commit --date=relative"
Une fois que votre alias est défini, ici "lg", vous pouvez l'utiliser avec la commande suivante :
git lg
git propose des commandes intégrées pour apprendre à l'utiliser :
git help
git help tutorial
git help tutorial-2
git help everyday
By Fabien ROZAR