Activité pratique
Durée2h30Consignes globales
Cette activité se déroule en deux parties. La première se fait seul(e), la seconde en binôme (un trinôme au maximum si le compte est impair).
Le fil conducteur est un projet uv, comme celui que vous avez créé en séance 2. Ce n’est pas un détail de mise en scène : uv init place d’emblée votre projet sous contrôle de version, et le .gitignore qu’il écrit répond à la question la plus importante du versionnage – qu’est-ce qu’on partage, et qu’est-ce qu’on ne partage pas ?
En première partie, vous versionnez ce projet seul(e) et le publiez sur GitLab. En seconde partie, vous travaillez à deux sur le même dépôt, vous provoquez délibérément des conflits, et vous les résolvez.
Information
Gardez les fiches de cours ouvertes à côté : Git pour les commandes, GitLab pour l’interface web et les clés SSH, Installer Git si l’outil n’est pas encore sur votre machine.
Important
Git exécute exactement ce que vous lui demandez, dans le dossier où se trouve votre terminal. Avant de lancer une commande, sachez où vous êtes et ce qu’elle va faire : chaque bloc de commandes de ce TP est précédé d’une explication, lisez-la avant de copier.
Si un résultat ne ressemble pas à ce qui est annoncé, arrêtez-vous et appelez l’encadrant(e), plutôt que d’enchaîner les commandes suivantes ou de demander une solution à une IA. Une IA ne connaît ni votre machine, ni le GitLab de l’école, ni la suite du TP : elle propose volontiers des commandes génériques (git init, git reset --hard, git push --force, suppression de dossiers…) qui aggravent la situation. Un git status montré à l’encadrant(e) règle la plupart des problèmes en deux minutes.
Contenu de l’activité
Versionner un projet uv
Cette partie se fait en autonomie. Elle vous fait parcourir seul(e) le cycle complet : créer, enregistrer, publier, puis vérifier que quelqu’un d’autre pourrait repartir de votre dépôt.
Installer Git
Git est un logiciel qui s’installe sur votre machine, indépendamment de GitLab qui n’est qu’un serveur. Il est peut-être déjà présent : c’est souvent le cas sous MacOS et Linux.
À faire
Installez Git en suivant la section Installer le logiciel de la fiche, pour votre système. Si Git est déjà installé, passez directement à la vérification.
Sous Windows, gardez les valeurs par défaut proposées par l’installeur. Sous MacOS, si une fenêtre propose d’installer les « outils de développement en ligne de commande », acceptez : c’est ainsi que MacOS fournit Git.
Important
Un terminal ouvert avant l’installation ne voit pas Git. Une fois l’installation terminée, fermez tous vos terminaux, et fermez complètement VS Code si vous utilisez son terminal intégré, avant de continuer. Sinon, uv ne trouvera pas Git et votre projet sera créé sans dépôt.
Vérifier son installation
Vérifions maintenant que Git répond, ainsi que uv installé en séance 2.
À faire
Ouvrez un nouveau terminal et vérifiez que Git et uv sont disponibles. Ne tapez aucune autre commande Git pour « tester » : en particulier, pas de git init, qui transformerait le dossier courant, souvent votre dossier personnel, en dépôt Git.
Chaque commande doit afficher un numéro de version, 2.28 ou plus récent pour Git. Si Git n’est pas reconnu dans un nouveau terminal, ou si sa version est plus ancienne, appelez l’encadrant(e).
Configurer Git
Avant le premier commit, Git réclame deux réglages : votre nom et votre adresse électronique. C’est ce qu’il inscrira dans chacune de vos versions.
On vous demande également d’effectuer deux autres réglages pour garantir que Git se comportera de la même façon sur toutes les machines de la salle, quelle que soit sa version :
init.defaultBranch main: donne le nommainà la branche créée avec chaque nouveau dépôt. Historiquement, Git l’appelaitmaster; l’usage est aujourd’huimain, et c’est ce qu’attend GitLab.pull.rebase false: indique àgit pullde fusionner le travail distant avec le vôtre. Sans ce réglage, les versions récentes de Git refusent lepulldès que vous et votre binôme avez tous les deux travaillé, ce qui arrivera dans la seconde partie.
L’option --global enregistre ces réglages une fois pour toutes sur votre machine : vous n’aurez plus à y toucher, ni pour ce TP ni pour les suivants.
À faire
Renseignez les quatre réglages, en remplaçant le nom et l’adresse de l’exemple par les vôtres, puis relisez la configuration obtenue.
Important
Utilisez l’adresse électronique de l’école, celle avec laquelle vous vous connectez à GitLab. Si les deux diffèrent, vos versions apparaîtront sur GitLab comme provenant d’un inconnu, et vous ne serez pas crédité(e) de votre travail.
La dernière commande doit afficher, parmi d’autres, les lignes user.name=..., user.email=..., init.defaultbranch=main et pull.rebase=false. Si l’une manque ou contient une faute de frappe, relancez simplement la commande correspondante : la nouvelle valeur remplace l’ancienne.
Créer un projet et découvrir le dépôt qu’il contient
uv init ne fait pas que préparer un projet Python : il exécute aussi git init pour vous. Vous allez donc vous trouver, sans avoir tapé une seule commande Git, dans un dépôt déjà constitué.
À faire
Dans l’arborescence de cours créée en séance 2, créez un dossier session3 à côté de session2, puis un dossier calculatrice à l’intérieur. Placez ensuite votre terminal dans ce dossier calculatrice, vérifiez où vous êtes, initialisez-y un projet uv, puis demandez à Git où se trouve le dépôt et quel est l’état du dossier.
Les commandes ci-dessous supposent que votre arborescence est dans Documents, comme dans l’exemple de la séance 2. Si vous l’avez rangée ailleurs, adaptez le chemin de la première commande. La commande suivante affiche le dossier dans lequel se trouve votre terminal : vérifiez qu’il se termine bien par calculatrice avant d’aller plus loin.
git rev-parse --show-toplevel affiche le dossier racine du dépôt dans lequel vous vous trouvez. Il doit se terminer par calculatrice : c’est la preuve que le dépôt est celui de votre projet, et de rien d’autre.
Important
uv init ne crée un dépôt Git que si deux conditions sont réunies : Git est disponible dans le terminal, et le dossier ne fait pas déjà partie d’un autre dépôt. Dans le cas contraire, il ne crée ni dossier .git, ni fichier .gitignore, sans afficher d’erreur. Deux situations doivent donc vous arrêter :
git rev-parse --show-toplevelaffiche un autre dossier quecalculatrice, par exemple votre dossier personnel ou le dossierinfo: un dépôt existe plus haut dans l’arborescence.- Git répond
fatal: not a git repository:uvn’a pas trouvé Git, en général parce que le terminal a été ouvert avant l’installation de Git.
Dans les deux cas, ne tapez pas git init vous-même : appelez l’encadrant(e). Dans le second, il suffit en général d’ouvrir un nouveau terminal, de supprimer le dossier calculatrice et de recommencer cette étape.
À faire
Ouvrez ensuite le dossier calculatrice dans VS Code. Quels fichiers/dossiers semblent concerner Git ?
Correction
Enregistrer une première version
Deux étapes séparent votre travail d’une version enregistrée : git add choisit ce qui entrera dans la version, git commit l’enregistre avec un message. Prenez le réflexe d’encadrer chaque commande par un git status, qui vous montre l’effet de ce que vous venez de faire.
À faire
Ajoutez tout le contenu du projet à l’index, enregistrez-le dans une version dont le message décrit ce qu’elle contient, et affichez l’historique.
À faire
Listez les fichiers que ce premier commit contient. Le dossier .venv existe-t-il sur votre disque ? Apparaît-il dans le commit ? Pourquoi ?
Ajouter une dépendance et observer ce que Git en dit
C’est ici que le choix d’un projet uv prend tout son sens : une seule commande va modifier trois choses sur votre disque, et Git ne va en voir que deux.
À faire
Ajoutez numpy comme dépendance du projet, observez ce que Git signale, puis enregistrez cette évolution dans une version dédiée.
À faire
uv add numpy a modifié ou créé trois choses sur votre disque. Lesquelles ? Combien d’entre elles apparaissent dans git status ? Quelle est, en une phrase, la règle générale que cela illustre ?
Correction
Publier le projet sur GitLab
Votre dépôt est pour l’instant purement local, et il fonctionne très bien ainsi. Lui associer un dépôt distant ajoute deux choses : une sauvegarde ailleurs, et la possibilité de partager.
À faire
Créez sur GitLab un projet nommé calculatrice, sans fichier README, récupérez son URL de clonage, puis associez-le à votre dépôt local et envoyez votre travail.
Connectez-vous sur https://gitlab-df.imt-atlantique.fr pour créer le projet. N’ajoutez pas de README : votre dépôt local a déjà son histoire, et un commit créé par GitLab entrerait immédiatement en conflit avec elle.
Dans le menu Code du projet, GitLab propose deux URL de clonage. Prenez celle en HTTPS : elle fonctionne immédiatement, votre adresse et votre mot de passe GitLab servant d’identifiants au premier push. Elle a la forme suivante :
Information
L’URL SSH, proposée juste à côté, évite d’avoir à saisir ses identifiants à chaque fois, mais suppose d’avoir généré une paire de clés et déposé la clé publique sur GitLab. Pour aujourd’hui, HTTPS suffit : ne perdez pas le temps de la séance là-dessus.
En revanche, posez cette clé avant la première séance du projet PyRat, en suivant la fiche GitLab. Vous y pousserez à trois pendant tout le semestre : dix minutes de configuration maintenant valent mieux qu’un mot de passe à ressaisir à chaque push.
La première commande déclare le dépôt distant sous le nom origin, la deuxième affiche les dépôts distants déclarés pour vérification, et la dernière envoie votre branche main sur GitLab. Entre les deux, git branch -M main renomme votre branche courante en main : si Git l’a créée sous le nom master, ce qui arrive sur les machines dont Git est ancien ou mal configuré, le push échouerait sinon avec le message src refspec main does not match any. Si elle s’appelle déjà main, la commande ne fait rien.
git remote -v doit afficher deux lignes commençant par origin https://gitlab-df.imt-atlantique.fr/. Si l’adresse est fausse (mauvaise instance, faute de frappe, <votre identifiant> laissé tel quel), corrigez-la avec git remote set-url origin <bonne adresse> plutôt que de refaire un git remote add, qui échouerait car origin existe déjà.
Rechargez la page du projet sur GitLab : vos fichiers et vos commits doivent y être, sur la branche main.
À faire
Sur l’interface web de GitLab, ouvrez la liste des fichiers du projet. Le dossier .venv y est-il ? Et uv.lock ? Comparez avec ce que contient votre dossier local, et expliquez l’écart.
Vérifier que le projet est reproductible
C’est le test qui compte : quelqu’un d’autre peut-il faire tourner votre code à partir du seul dépôt ? Jouons ce rôle en clonant votre propre projet ailleurs sur le disque.
Important
Si le terminal que vous utilisez a un environnement virtuel actif (la ligne de commande commence par un texte entre parenthèses, comme (.venv) ou (calculatrice)), désactivez-le avec deactivate, ou ouvrez simplement un nouveau terminal, avant de travailler sur un autre projet.
À faire
Créez à la main un dossier essai dans votre dossier session3, à côté de calculatrice et donc en dehors du projet. Placez-y votre terminal, clonez-y votre projet, constatez l’absence de .venv, puis reconstruisez l’environnement et exécutez le programme.
À faire
Combien de commandes ont été nécessaires pour rendre le projet exécutable à partir de rien ? Quelle version de numpy a été installée, et pourquoi êtes-vous certain(e) que c’est exactement la même que dans votre dossier d’origine ?
Travailler à plusieurs
Constituez un binôme. Dans ce qui suit, l’une des deux personnes est désignée comme A, l’autre comme B. Vous allez partir du dépôt de A et y travailler à deux.
Partager un dépôt
Donner accès à quelqu’un se fait entièrement côté GitLab : Git, lui, ne connaît pas la notion de membre. Le rôle Developer suffit pour pousser du code.
À faire
A ajoute B au projet calculatrice avec le rôle Developer (menu Manage > Members). B crée à la main un dossier binome dans son dossier session3, y clone le projet de A et reconstruit l’environnement.
Le dossier binome n’est pas un détail : B a déjà son propre dossier calculatrice dans session3, et git clone refuse d’écrire dans un dossier qui existe déjà. Pour toute la suite de la partie, B travaille dans binome/calculatrice.
Mettre du code dans le projet
Le projet ne contient encore que le main.py d’exemple. Ajoutons-y de quoi travailler à deux.
À faire
A crée le fichier calculatrice.py donné ci-dessous, le versionne et l’envoie sur le dépôt distant. B le récupère avec git pull.
Provoquer un conflit sur les dépendances
Voici un conflit très fréquent en projet, et propre aux projets uv : deux personnes ajoutent une bibliothèque en même temps. Le premier push passe, le second est refusé.
À faire
Sans vous concerter et sans faire de pull, A ajoute scipy et B ajoute matplotlib, puis chacun(e) versionne et pousse.
La personne dont le push est refusé récupère le travail de l’autre avec git pull --no-rebase. L’option n’est pas un détail : si Git est configuré pour rebaser par défaut sur votre machine, la suite de cet exercice ne se déroulerait pas comme décrit ici, et --ours ne désignerait plus la même version. Avec elle, tout le monde part du même état.
Le pull signale alors un conflit dans uv.lock, et le plus souvent un autre dans pyproject.toml.
Information
Selon les deux bibliothèques choisies et l’ordre dans lequel uv les a inscrites, il arrive que Git fusionne pyproject.toml tout seul, sans rien vous demander : les deux ajouts ne touchent alors pas la même ligne. C’est normal, et c’est même le cas le plus fréquent en projet.
Vérifiez dans ce cas que le fichier contient bien les deux dépendances, et passez directement à uv.lock. Lui conflite à tous les coups : il est régénéré en entier à chaque uv add, donc ses deux versions diffèrent sur des centaines de lignes.
À faire
S’il y a un conflit dans pyproject.toml, résolvez-le à la main dans VS Code en gardant les deux dépendances. Ne touchez pas à uv.lock : régénérez-le.
L’autre personne termine par un git pull puis un uv sync, et vérifie que scipy et matplotlib sont disponibles.
À faire
Pourquoi résout-on pyproject.toml à la main, mais surtout pas uv.lock ? Que se passerait-il si vous choisissiez « garder ma version » sur uv.lock sans lancer uv lock ensuite ?
Correction
Provoquer un conflit sur le code
Le conflit précédent portait sur des fichiers de configuration. Voyons maintenant celui que vous rencontrerez le plus souvent : deux personnes modifient les mêmes lignes du même fichier de code.
À faire
Après un git pull de chaque côté, répartissez-vous les deux tâches ci-dessous, qui touchent volontairement les mêmes lignes de calculatrice.py. Chacun(e) travaille, versionne et pousse ; le second push sera refusé.
- Tâche 1 – Ajouter une opération
modulo, qui renvoie le reste de la division du premier nombre par le second, et l’ajouter au menu et au dictionnaireoperations. - Tâche 2 – Valider les entrées : refuser proprement une saisie qui n’est pas un nombre, en affichant un message clair plutôt qu’une trace d’erreur.
Faites ensuite un git pull --no-rebase, ouvrez le fichier dans VS Code et utilisez l’éditeur de fusion pour construire une version qui contient les deux contributions. Terminez par le cycle habituel add, commit, push, et vérifiez que le binôme récupère bien le résultat.
Documenter le projet
GitLab affiche automatiquement le fichier README.md placé à la racine du dépôt, sur la page d’accueil du projet. C’est la première chose que verra quelqu’un qui découvre votre travail – correcteur(rice) inclus(e).
À faire
À deux, complétez le README.md créé par uv, versionnez-le et vérifiez son rendu sur la page d’accueil GitLab du projet.
Votre README.md doit contenir au minimum :
- ce que fait le projet, en deux phrases ;
- comment l’installer et le lancer – soit exactement les deux commandes que B a tapées après le clonage ;
- la liste des opérations disponibles ;
- les noms des deux contributeur(rice)s.
Pour la syntaxe, voyez la référence Markdown et les spécificités GitLab.
Important
Un projet non documenté est un projet inutilisable. Ce n’est pas une formule : sans README, personne ne sait par quelle commande lancer votre code, et votre travail devient invérifiable.
À faire
Votre README.md permettrait-il à un(e) camarade d’un autre binôme de faire tourner votre calculatrice sans vous poser de question ? Testez-le pour de vrai en échangeant vos URL avec un autre binôme.
Gérer le dépôt depuis VS Code
Tout ce que vous venez de faire en ligne de commande est aussi accessible depuis l’IDE. Maintenant que vous savez ce qui se passe dessous, l’interface graphique devient un confort et non une boîte noire.

À faire
Faites une modification mineure dans calculatrice.py, puis effectuez un cycle complet add / commit / push sans quitter VS Code, depuis le panneau Source Control.
Vous y retrouverez, dans l’ordre : la liste des fichiers modifiés, le bouton + qui ajoute à l’index, la zone de message de commit, et le bouton de synchronisation qui envoie vers le dépôt distant.
Pour aller plus loin dans l’intégration, installez l’extension GitLab pour VS Code et authentifiez-vous auprès de l’instance de l’école. Il vous faudra créer un jeton (token) depuis votre profil GitLab, avec la portée api. Activez ensuite l’affichage des auteurs ligne par ligne, via le réglage git.blame.editorDecoration.enabled :

En plaçant le curseur sur une ligne, VS Code indique le message de commit, l’auteur(e) et la date de sa dernière modification.
À faire
Sur une ligne écrite par votre binôme, retrouvez le message de commit associé. Ce message vous explique-t-il pourquoi la ligne est là ? Reformulez-le comme vous auriez aimé le lire.
Pour aller plus loin
Travailler sur une branche
Jusqu’ici, vous avez tous les deux travaillé sur main, d’où les conflits. La pratique courante en équipe est de créer une branche par tâche, puis de la fusionner quand elle est terminée.
Sur GitLab, cette branche peut alors faire l’objet d’une merge request : votre binôme relit vos modifications et les commente avant qu’elles n’entrent dans main. C’est le mode de travail que vous adopterez pour le projet du semestre.
Retrouver un état antérieur
Tout l’intérêt de versionner est de pouvoir revenir en arrière. Explorez l’historique, puis affichez l’état d’un fichier à un commit donné.
Et si on avait versionné .venv ?
Pour bien mesurer l’intérêt du .gitignore, essayez : retirez .venv du .gitignore, faites git add ., et regardez le nombre de fichiers que git status annonce, puis la taille du dossier. Ne validez pas ce commit : annulez avec git restore --staged . et remettez la ligne dans .gitignore.
Pour aller encore plus loin
Information
Y a-t-il quelque chose que vous auriez aimé voir ici ? Faites-le nous savoir sur le serveur Discord ! Peut-être pouvons-nous l’ajouter rapidement. Sinon, cela nous aidera à améliorer le cours pour l’année prochaine !