Introduction à Git

Ludovic Deneuville

Introduction

  • Outil indispensable
  • Pas d’évaluation immédiate
    • mais utilisé toute la scolarité et vie pro

Introduction

Vous faites parti 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 coté 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 ?

Au programme

  • 📌 Versionner son code
  • 💾 Historique des modifications
  • 👷 Travail en équipe

Pourquoi versionner ?

  • Quelle est la bonne version ?
  • Comment faire pour revenir en arrière ?
  • Qui a écrit ce code ? Quand ?

Pour connaitre la véritable dernière version

Ancien code commenté

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

La solution

Git

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

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.

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…)

Git Bash

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

Commandes Unix

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)

Copier-Coller

Warning

  • CTRL + C et CTRL + V ne fonctionnent pas !
  • CTRL + C : stopper un processus (très utile)

2 possibilités pour coller du texte :

  • Clic droit
  • MAJ + INSERT

Versionner son code

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

Workflow

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

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>"

Exemple

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

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

Le 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

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, Bitbucket…)
  • n dépôts locaux
    • clone sur votre machine
    • git permet la synchronisation des dépôts

Remarque

Il est tout à fait possible d’avoir plusieurs clones du même dépôt sur son poste.

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

Important

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

flowchart LR
    github[(Dépôt distant)]
    dev1[(Dépôt local 1)]
    dev2[(Dépôt local 2)]
    dev3[(Dépôt local 3)]
    dev4[(Dépôt local 4)]
    
    github <--> dev1
    github <--> dev2
    dev3 <--> github
    dev4 <--> github

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 pousser et puller réguliérement son code pour garder son dépôt à jour.

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

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 parti du .gitignore

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

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 votre 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

2 versions s’opposent

Résoudre un conflit

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

Cloner un dépôt

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

Remarque

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.

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

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

Démo

Travailler dans le cloud

  • Autre manière de travailler
  • Services non perennes
  • Sauvegarder votre code

Les branches

Imaginez que vous souhaitez ajouter une nouvelle fonctionnalité à votre code.

Seulement vous n’êtes pas encore sûr que :

  • cette fonctionnalité sera vraiment utile 😐
  • qu’elle ne va pas tout casser 😰

Note

  • si c’est tout petit, vous pouvez dev en local en faire un reset au cas où
  • sinon utilisez une branche

Les branches

Vous aimeriez pouvoir :

  • tester votre nouveau code
  • de manière isolée
  • sans polluer le dépôt

Note

La branche principale se nomme généralement main ou master.

La solution

  • Créez une branche
  • Développez sur cette branche (add, commit, push…)
  • Selon vos conclusions
    • fusionnez votre branche avec le tronc
    • supprimez votre branche

Commandes liées aux branches

Commande Description
git branch -a Lister toutes les branches
git switch <branch> Changer de branche
git switch -c <branch> Créer et changer de branche
git merge <branch> Fusionner <branch> dans la branche actuelle
git branch -d <branch> Supprimer la branche
git push origin <branch> Pousser la branche vers le dépôt distant

Bibliographie