Introduction Ă  Git

Gestion de version
Travail en équipe
DépÎt local/distant
Workflow
Conflit
👉 Slides
Author

Ludovic Deneuville

Introduction

  • Outil indispensable
  • Utilisation :
    • TP informatiques, R
    • Dans tous vos projets
    • Dans votre vie professionnelle
  • UtilisĂ© en projet
  • ÉvaluĂ© en ComplĂ©ments d’info 2A
  • Suivi d’un TP

⚠ valable pour tous les TP :

  • lisez le sujet avant
  • soyez prĂȘts (pas 20 min pour se logger)
  • n’allez pas trop vite
  • suivez prĂ©cisĂ©ment les consignes
  • rĂ©flĂ©chissez (il peut y avoir des coquilles)
  • < 
 > -> remplacer

Introduction

Vous faites partie d’une Ă©quipe de 5 personnes qui doit coder une application de jeux de cartes.

😕 Comment mettre en commun votre code ?

  • Vous dĂ©veloppez chacun de votre cĂŽtĂ© et Ă  la fin, vous mettez tout en commun
  • Vous envoyez vos programmes par mail
  • Vous crĂ©ez un dossier commun

😅 En cas d’erreur, comment revenir en arriùre ?

On va essayer de trouver un moyen pour bosser efficacement.

Au programme

  • 📌 Versionner son code
  • đŸ’Ÿ Historique des modifications
  • đŸ‘· Travail en Ă©quipe

2 grandes problématiques :

  • Versionner le code
  • Partager du code

Pourquoi versionner ?

  • Quelle est la bonne version ?
  • Comment faire pour revenir en arriĂšre ?
  • Qui a Ă©crit ce code ? Quand ?
  • les questions que l’on peut se poser en projet
  • Mais qui a Ă©crit cette merde ???
    • ah ben c’est moi
 il y a 2 ans
    • plutĂŽt bon signe -> ça veut dire qu’on progresse

Pour connaßtre la véritable derniÚre version

MĂȘme si vous ĂȘtes bien intentionnĂ©, ça finira par dĂ©raper

Solutions naĂŻves :

  • Pas de versionnage
    • vous Ă©crasez les anciens fichiers
  • Copier intĂ©gralement le dossier Ă  chaque modif
    • projet_v1, projet_v2
  • incrĂ©menter les noms de fichier

Ancien code commenté

Vous souhaitez passer de R-base Ă  ggplot2 pour votre graphique.

Mais vous vous dites que c’est mieux de garder l’ancien code au cas oĂč


La solution

La solution, tous en choeur, c’est 


Git

  • git : connard en argot britannique

Objectifs :

  • 1A apprentissage
  • 2A fluent
  • 3A maitrise

Historique

  • Créé par Linus Torvalds en 2005
  • Pour gĂ©rer le dĂ©veloppement du noyau Linux
  • Le standard incontournable de la gestion de versions
  • Anciens outils : CVS, SVN
  • Standard : produit qui s’est imposĂ© par l’usage (ex : Moteur de recherche Google, TCP/IP)
    • peu causer des problĂšmes de monopole


Logiciel

  • Logiciel Libre, Open source
  • Gratuit
  • DĂ©centralisĂ©
Note

😹 Git s’utilise majoritairement en ligne de commande dans un terminal Git Bash.
😅 Pas de panique, quelques commandes suffisent pour travailler avec Git.

Il existe aussi des interfaces graphiques mais elles sont souvent imparfaites et sources d’erreur.

  • Logiciel libre
    • code source est ouvert et disponible
    • permettant Ă  quiconque de l’utiliser, le modifier, et le distribuer librement
    • diffĂ©rent de gratuit
    • lĂ©gĂšrement diffĂ©rent de Open source
      • Open Source : avantages pratiques et collaboratifs
      • Libre : libertĂ©s et les droits Ă©thiques des utilisateurs
  • DĂ©centralisĂ©
    • chaque utilisateur dispose d’une copie complĂšte de l’historique de tout le projet

Késako

  • Git âžĄïž Logiciel de gestion de versions
  • Git Bash âžĄïž Terminal pour Ă©crire des commandes git
  • GitHub / GitLab âžĄïž Plateforme de dĂ©veloppement collaboratif
    • HĂ©berge des dĂ©pĂŽts Git
    • Propose d’autres fonctionnalitĂ©s (CI/CD, wiki, gestion des incidents
)
  • GitHub rachetĂ© par Microsoft en 2018
  • GitLab, Libre, possible d’avoir son propre GitLab interne

Git Bash

  • Terminal de commande
  • Plusieurs maniĂšres de lancer (Menu Windows, clic droit, inclus dans VSCode)

Conseil : lors de l’installation de Git, choisissez le terminal Unix

  • 1ere ligne : prompt (username, machine, rĂ©pertoire actuel)
  • 2e ligne (commence par $) : commande
  • 3e ligne : rĂ©sultat de la commande

Bref aparté sur les commandes Unix.

Il fut un temps oĂč tout se faisait par ce biais (pas d’explorer)

Commandes Unix

  • ce qui est entre < 
 > est Ă  remplacer
  • ll : ls -l
  • cd : change directory
  • pwd : print working directory
  • mkdir : make directory
  • pour Ă©diter un fichier : vi, nano
  • man

Attention avec les commandes rm, kill

Commandes Unix - Exemples

Pour chaque commande, de nombreuses options sont disponibles

ls *.py              # liste tous les fichiers python du répertoire courant
ls *.py > a.txt      # crée un fichier a.txt contenant le résultat de la commande
cd ..                # se positionne dans le répertoire parent
cd ../projet/src     # remonter dans le dossier parent puis aller dans projet puis src
cp /p/image.jpg .    # copie le fichier image.jpg du disque P dans le dossier courant
./setup.sh           # lance le programme setup.sh du répertoire courant
Tip
  • . : reprĂ©sente le dossier courant
  • .. : reprĂ©sente le dossier parent
  • ~ : rĂ©pertoire personnel de l’utilisateur (echo $HOME)

répertoire = dossier

La ligne de commande reste trÚs utilisée :

  • rapide, efficace
  • automatisation
    • exemple : renommer 1000 fichiers d’un dossier

git add .: add current

Copier-Coller

Warning
  • CTRL + C et CTRL + V ne fonctionnent pas toujours !
  • CTRL + C : stopper un processus (trĂšs utile)

2 possibilités pour coller du texte :

  • Clic droit
  • MAJ + INSERT

Raccourcis indispensables:

  • CTRL+ A : select all
  • TABULATION: autocomplete
  • HISTORIQUE âŹ†ïž et âŹ‡ïž

Versionner son code

  • Au dĂ©but j’ai parlĂ© de versionner
  • Comment faire avec Git

Que versionne-t-on ?

  • ✅ des fichiers de type texte (lĂ©gers)
  • ✅ du code source
  • ❌ fichiers de donnĂ©es
  • ❌ mots de passe
  • ❌ outputs : logs, .pdf, .doc
  • un dĂ©pĂŽt doit rester lĂ©ger
  • quelques Mo max
  • possible de mettre du doc ou pdf
    • mais git ne sait comparer que du txt, csv, md
    • tout ce qui peut s’ouvrir avec notepad

Workflow

sequenceDiagram
    Workspace ->> Staging index: add
    Staging index ->> Local repository: commit
    Local repository ->> Remote repository: push
    Remote repository ->> Workspace: pull

Retenir Local et Remote, mais en fait c’est un peu plus complexe :

  • ça fait un peu peur, pas intuitif au dĂ©but
  • workspace : tous les fichiers de votre dossier
  • staging : fichiers reconnus par git
  • local : sauvegardes du dĂ©pĂŽt local

Plus facile dans un sens que l’autre

Créer un commit

2 étapes pour créer une nouvelle version :

  • git add <filename>
    • ajouter le fichier Ă  l’index (i.e. dire Ă  Git de suivre ce fichier)
    • git add . : pour ajouter tous les fichiers
  • git commit -m "<mon message>"
  • git utilise la sauvegarde incrĂ©mentale
  • il ne garde que les modifs apportĂ©es depuis le dernier commit

https://talks.freelancerepublik.com/git-commandes-indispensables-developpeurs/

Exemple

git checkout <commit_number> : les fichiers de votre dĂ©pĂŽt sont alors dans l’état oĂč ils Ă©taient Ă  ce commit

Message du commit

😔 Ce n’est pas toujours Ă©vident de trouver un message court et explicite.

Tip

Utilisez un préfixe à votre message selon le pattern <type>: <sujet>:

  • doc: mise Ă  jour documentaire
  • feat: nouvelle fonctionnalitĂ©
  • fix: correction
  • refactor: mise au propre du code
  • revert: retour arriĂšre
  • test: Modification des tests

Suffixe WIP

Mon petit commit

Privilégiez de nombreux petits commits à un gros commit final :

  • Un commit = une modification cohĂ©rente
  • Plus facile de comprendre l’historique
  • Plus facile de revenir en arriĂšre

Retour arriĂšre

Si finalement, vous n’avez pas envie de « commiter » vos modifications ?

Commande Description
git restore <file> Annuler les modifications locales non indexées du fichier
git reset <file> Desindexer un fichier
git reset --hard Revenir Ă  l’état du dernier commit,
perdant toutes les modifications locales
git stash Sauvegarder et remettre le working directory Ă  l’état du dernier commit
Caution

Attention avec les commandes contenant les mots force, hard


Ignorer des fichiers

TipLe fichier .gitignore

.gitignore est un fichier prĂ©sent Ă  la racine du dĂ©pĂŽt permettant de dire Ă  Git quels fichiers il doit ignorer. Par exemple, s’il contient :

  • *.csv âžĄïž tous les fichiers csv seront ignorĂ©s par Git
  • data/ âžĄïž le dossier data et son contenu sera ignorĂ©

Cela est utile, pour exclure par exemple du dépÎt Git :

  • des fichiers contenant des mots de passe, des jetons d’accĂšs

  • des fichiers volumineux de donnĂ©es qui n’ont pas vocation Ă  ĂȘtre versionnĂ©s
  • des fichiers de log
  • En info, il y a souvent plein de fichiers de config
  • ⚠ Mots de passe âžĄïž git garde tout l’historique
  • Next
    • c’était pour la partie “gestion du dĂ©pĂŽt local”
    • ensuite regardons comment communiquer avec le dĂ©pĂŽt distant

Exemple

.gitignore
.env
.venv/
__pycache__/
.pytest_cache/
.ruff_cache/

*.log

doc/exams/**/*2026*

Git / pas Git ?

Un petit quizz !

Projet info

Projet info/
├── .github/
│   └── workflows/
│       └── ci.yml
├── backend/
│   ├── pyproject.toml
│   └── src/
│       ├── dao/
│       ├── service/
│       └── main.py
├── data/
│   ├── create_tables.sql
│   └── insert_data.sql
├── doc/
│   ├── rapport.qmd
│   └── suivi.md
├── .env
├── .gitignore
├── docker-compose.yml
└── README.md

Git mais attention :

  • dossier data/ -> bof
  • fichier .env -> mots de passe


Projet éco

Les Nudges/
├── Articles/
│   ├── Sunstein_2014_Nudging.pdf
│   ├── Kahneman_1990.pdf
│   └── Nudges that dont nudge.pdf
├── Notes/
│   ├── idees.docx
│   ├── bibliographie.docx
│   └── donnĂ©es.csv
└── Rapport/
    ├── rapport.docx
    ├── rapport_v2.docx
    ├── rapport_v3_final.docx
    ├── rapport_v3_final.pdf
    └── rapport_v3_final_corrige.docx
    ├── presentation.pptx
    └── presentation_finale.pptx

Pas Git :

  • versions gĂ©rĂ©es manuellement
  • beaucoup de fichiers Word/PDF

Projet stat

Projet Loto/
├── .gitignore
├── README.md
├── suivi.md
├── data/
│   ├── README.md
│   └── loto.csv
├── R/
│   ├── 01_load.R
│   ├── 02_clean.R
│   ├── 03_explore.R
│   ├── 04_analyze.R
│   └── 05_visualize.R
├── rapport/
│   ├── rapport.qmd
│   └── rapport.pdf
└── presentation/
    └── soutenance.qmd

Git :

  • fichiers versionnĂ©s
  • Repo bien organisĂ©

Réglement de scolarité

J’ai pris un exemple dans une Ă©cole au hasard, c’est pas chez nous

Travailler en équipe

DépÎt local et dépÎt distant

  • 1 dĂ©pĂŽt distant
    • appelĂ© aussi remote
    • hĂ©bergĂ© sur une forge (GitHub, GitLab
)
  • n dĂ©pĂŽts locaux
    • clone sur votre machine
    • git permet la synchronisation des dĂ©pĂŽts
NoteRemarque

Il est tout Ă  fait possible d’avoir plusieurs clones du mĂȘme dĂ©pĂŽt sur son poste.

  • avoir un accĂšs internet / rĂ©seau local pour communiquer avec remote
  • c’était pas nĂ©cessaire pour faire des add / commit

Commencer dessin avec :

  • un remote v0
  • 2 clones de Bob et Alice en v0

DépÎt local et dépÎt distant

Important

Chaque dépÎt est une copie intégrale du projet.

flowchart
    github[(DépÎt distant)]
    dev1[(DépÎt local 1)]
    dev2[(DépÎt local 2)]
    
    github <--> dev1
    github <--> dev2

Comme une cellule du corps humain.

  • Si vous perdez un dĂ©pĂŽt, il suffit de repartir d’un autre

Communiquer avec le dépÎt distant

  • git pull : mettre Ă  jour son dĂ©pĂŽt local Ă  partir du dĂ©pĂŽt distant
  • git push : envoyer ses commits locaux sur le dĂ©pĂŽt distant
Important

Il est important de push et pull réguliÚrement son code pour garder son dépÎt à jour.

Vous faites toujours vos actions sur un dépÎt local.

Vous ne modifiez jamais le dépÎt distant.

  • push and pull rĂ©guliers sinon vos versions vont diverger

git push

DĂ©pĂŽt local âžĄïž DĂ©pĂŽt distant

Pour pouvoir pousser son code, il est nécessaire :

  • d’avoir au prĂ©alable créé au minimum un commit
  • que votre dĂ©pĂŽt local soit Ă  jour
    • pas de retard de version par rapport au dĂ©pĂŽt distant
    • si ce n’est pas le cas, il faut commencer par git pull

Vous pouvez push plusieurs commits

git push - si votre dĂ©pĂŽt local n’est pas Ă  jour

! [rejected]        main -> main (fetch first)
error: failed to push some refs
hint: Updates were rejected because the remote contains work that you do not
hint: have locally. This is usually caused by another repository pushing to
hint: the same ref. If you want to integrate the remote changes, use
hint: 'git pull' before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.


Le message est assez explicite.

git push - fichier disparu

  • Vous venez de faire un git push
  • Mais votre fichier n’apparait pas sur le dĂ©pĂŽt distant

  • Probablement parce que vous avez oubliĂ© de l’ajouter Ă  l’index avec git add <mon_fichier>

Autre possibilité : votre fichier est ignoré par git car il fait partie du .gitignore

ça arrive quand vous voulez aller trop vite

git pull

DĂ©pĂŽt local âŹ…ïž DĂ©pĂŽt distant

  • Mise Ă  jour de votre dĂ©pĂŽt local
  • S’il y a eu des modifications sur le dĂ©pĂŽt distant

Un pull se fait généralement aprÚs un commit.

git pull - conflit

Que se passe-t-il si :

  • Alice a modifiĂ© un fichier et poussĂ© sa modification sur le dĂ©pĂŽt distant
  • Vous avez Ă©galement modifiĂ© le mĂȘme fichier et vous faites un git pull pour mettre Ă  jour votre dĂ©pĂŽt Ă  partir du dĂ©pĂŽt distant

😹 Un conflit ! Git ne sait pas choisir quelle est la bonne version entre la vître et celle d’Alice.

git pull - conflit

😅 Pas de panique ! Pour rĂ©soudre le conflit, il faut simplement :

  • modifier le fichier en question pour garder la bonne version
  • git add puis git commit pour valider la rĂ©solution du conflit

Il apparaßt sur votre dépÎt local.

  • conflit ≠ erreur
  • ça arrive

2 versions s’opposent

  • c’est un exemple, il peut y avoir d’autres types
  • git est assez bon pour merge (mĂȘme si 2 modifs sur mĂȘme fichier)
  • mais en cas de doute, il ne peut pas choisir

Résoudre un conflit

  • Contexte
    • Premier arrivĂ©, premier servi
    • Le conflit (aprĂšs votre pull)
  • Conflit
    • Git n’est pas un juge
    • VSCode : accept incoming/current/both change
  • RĂ©solution
    • supprimez les <<<<<<< et ======= âžĄïž pas du python
    • si vous relancez votre programme comme ça, il va pas aimer

Le conflit se résout sur son dépÎt local !

Etat du dépÎt local

Est-ce qu’il y a des fichiers :

  • non suivis ? Untracked files
  • prĂȘts Ă  ĂȘtre commitĂ©s ? Changes to be committed
  • modifiĂ©s non ajoutĂ©s Ă  l’index ? Changes not staged for commit
Important

La commande git status permet de répondre à ces questions.

Elle peut ĂȘtre utilisĂ©e n’importe quand, sans modĂ©ration ! đŸ»

git status

Est-ce que votre dépÎt local est en avance de n commit par rapport au dépÎt distant ?

Cloner un dépÎt

Pour créer votre dépÎt local.

git clone

  • Allez sur la page du dĂ©pĂŽt distant (GitHub, GitLab
)
  • Cliquez sur le bouton Code
  • Copiez l’adresse https ou ssh du dĂ©pĂŽt distant
  • git clone <adresse_depot>
  • exemples :
    • git clone https://github.com/ludo2ne/Git-tuto.git (https)
    • git clone git@github.com:ludo2ne/Git-tuto.git (ssh)

Créer sans cloner

NoteRemarque

Il est possible de créer un dépÎt local sans cloner un dépÎt distant (git init).

Et éventuellement ensuite de le brancher à un dépÎt distant.

Cependant ce cas d’utilisation est assez marginal.

https ou ssh ?

2 protocoles différents pour communiquer avec le dépÎt distant.

  • ssh :
    • clĂ© publique / clĂ© privĂ©e -> config machine
    • vous gĂ©nĂ©rez un secret depuis votre machine
  • https :
    • GitHub gĂ©nĂšre un token

Commandes principales

Commande Description
git clone <adr> Créer un dépÎt local sur son poste
git status Voir oĂč l’on en est
git add <file> Ajouter pour le prochain commit
git commit -m "<msg>" Créer un point de sauvegarde
git pull dĂ©pĂŽt local âŹ…ïž dĂ©pĂŽt distant
git push dĂ©pĂŽt local âžĄïž dĂ©pĂŽt distant

clone : bouton vert code sur GitHub, GitLab

Autres commandes

  • git diff : diffĂ©rence avec le dernier commit
    • git diff <filename>
  • git checkout <commit_number> : passer Ă  un commit spĂ©cifique
  • git log : historique des commits
    • git log --all --decorate --oneline --graph

La routine Git

  • pull : des fois qu’un camarade ait codĂ© la nuit

Démo

  • aller sur GitHub, cloner
  • crĂ©er un fichier, status
  • reset, status
  • modifier un fichier, status
  • commit
  • modifier sur github
  • push

Travailler sur le Datalab

  • Services non pĂ©rennes
  • Sauvegarder votre code

â†Ș Indispensable d’utiliser Git !

  • vous ne travaillerez pas toujours en local
  • mais parfois sur des services Ă  la demande
  • ex : besoin de puissance de calcul

Aller plus loin

  • Les branches
  • GitFlow
  • Pull request
  • Open source

Glossaire

Les bases

Terme Synonymes Signification
Git Outil de versionnage Logiciel qui gùre les versions et l’historique du code
GitHub Plateforme Git Service web pour héberger et collaborer sur des dépÎts Git
Git Bash Terminal Terminal pour lancer des commandes Git
DépÎt Repository, Repo Dossier contenant un projet Git (code + historique)
Remote DépÎt distant DépÎt hébergé sur un serveur (GitHub, GitLab
)
Local DĂ©pĂŽt local, Clone Copie d’un Remote sur ordinateur, ou dans ton service
Commit Point de sauvegarde État du projet Ă  un instant donnĂ©
Push Envoyer Transmettre les commits locaux vers le dépÎt remote
Pull Récupérer Ramener les commits du remote vers le local et les fusionner

Autres

Terme Synonymes Signification
Branche Branch Ligne parallÚle de développement dans un dépÎt
Main Master Branche principale (tronc)
Merge Fusion Action de combiner une branche dans une autre
Fork Copier un remote Copier un remote sur son propre compte GitHub
Issue Ticket Outil pour signaler un bug, une tĂąche ou une discussion
Pull Request PR, Merge Request Proposition d’intĂ©grer des changements d’une branche vers une autre

Bibliographie