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 toujours !
  • 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
    github[(Dépôt distant)]
    dev1[(Dépôt local 1)]
    dev2[(Dépôt local 2)]
    
    github <--> dev1
    github <--> dev2

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

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ée sur un serveur (GitHub, GitLab…)
Local Dépôt local, Clone Copie d’un Remote sur ordinateur, 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