Déb/u/o/gue tes humanités
Saison 04

Git – Archivage et partage des données

Formateur·trice·s :
Louis-Olivier Brassard, Giulia Ferretti
Lieu :
Bibliothèque des lettres et sciences humaines, local 2074
Date et heure :
(13h-15h)
Lien de la visioconférence :
https://meet.jit.si/DebogueHumanitesCRCEN-BLSH
Impression (bêta) :
Version imprimable
Support de présentation (cliquez pour ouvrir en grand ↗)

Sommaire

# Plan de la séance

  1. Introduction
  2. Qu’est-ce que Git ? Trois principes
  3. Installation
  4. Créer un projet en utilisant Git
  5. Les plateformes d’hébergement Git (GitHub / GitLab / FramaGit / …)
  6. Configurer Git
  7. Les commandes les plus usuelles

# 0. Introduction

Lorsque vous travaillez seul ou en équipe, vous risquez toujours de perdre une partie, voire l’entièreté de votre travail. Cela devient particulièrement critique lorsque vous avez accumulé des mois, voire des années de travail et que l’échéance approche : les conséquences d’une mauvaise sauvegarde peuvent être désastreuses !

Heureusement, un système simple mais fort robuste vous permet d’enregistrer l’historique de vos modifications et d’en faire une archive distribuée à différents endroits. Ce système est d’ailleurs fort utile lors de travaux réalisés à plusieurs : Git.

# 1. Qu’est-ce que Git ? Trois principes

Logo de Git

Git est un logiciel de gestion de versions décentralisé : il met en place un système distribué de contrôle de versions (Distributed version control system).

  1. Système distribué : un ensemble de composants indépendants situés sur des machines différentes qui partagent des messages entre eux afin d’atteindre des objectifs communs.
  2. Versionnement : chaque fois qu’on enregistre (commit), ou qu’on sauvegarde l’état de notre projet dans Git, Git prend un instantané de tous les fichiers, en sauvegardant une référence à l’instantané. Git traite donc nos fichiers comme une série d’instantanés dans le temps. Pour être plus efficace, si Git recconaît que certains fichiers n’ont pas changé depuis l’instantané précédent, Git ne les récupère pas à nouveau, mais crée smplement une collation vers le fichier précédent qui a déjà été sauvegardé.
  3. Contrôle : il n’est pas possible d’enregistrer (commit) une modification dans un fichier sans que cette modification soit vérifiée par le système de Git. Il ne peut pas arriver que des information soient perudes ou qu’un fichier soit corrompu sans que Git s’en aperçoive. Le mécanisme utilisé par Git pour mettre en œuvre cette vérification est un hash appelé SHA-1.

# 1.1. Un système distribué

Les avantages d’un système distribué

Schéma d’un réseau centralisé simple

Schéma d’un réseau centralisé simple

Schéma d’un réseau distribué

Schéma d’un réseau distribué

Les trois formes de réseaux selon Paul Baran (1962)

Les trois formes de réseaux selon Paul Baran (1962)

Les défauts des logiciels de gestion de versions

Il y a eu de nombreux systèmes ou logiciels de gestion de versions, mais tous avaient un ou plusieurs défauts :

# 1.2. Versionnement

Prenons un dossier de travail collaboratif sur un article :

# dossier de travail
.
├── article-michel-coquilles-corrigees.txt
├── article-relu-2021-12-09-final-ok-okok.txt
├── article-v1-relu-alice-bob-13fev.txt
├── article-v1-relu-alice-bob-VRAI.txt
└── article-vfinal-jeanne.txt

Quel fichier est le bon ? Quels fichiers contiennent les relectures de qui ?

# 1.2. Versionnement

Git permt de suivre un projet dans son ensemble (et pas forcément un fichier en particulier).

Il y a plusieurs principes inhérents à une bonne gestion collective de fichiers informatiques :

Visualisation d’un fil de travail collaboratif avec les «  branches  » de Git

Visualisation d’un fil de travail collaboratif avec les «  branches  » de Git

Le versionnement (versioning en anglais) entend répondre à plusieurs objectifs :

# 1.3. Contrôle

Git est un système de fichiers adressables en fonction de leur contenu.

Chaque fichier du dépôt Git est identifié par une chaîne de caractères hexadécimaux (0-9 et a-f) qui est calculée à partir du contenu du fichier et de sa position dans le dépôt.

Exemple de fichier avec la mise en surbrillance des modifications (diff)

Exemple de fichier avec la mise en surbrillance des modifications (diff)

# 1.5 Utilisations

Git est utilisé pour toutes sortes de projets: recherche scientifique, mémoires et doctorats, développement collaboratif de logiciels, archives personnelles, rédaction de documents en tous genres, publication de données, etc.

Exemples de projets utilisant Git :

# 2. Installation

# 2.1 En ligne de commande

Vous pouvez installer Git depuis son site web.

Pour voir si Git est bien installé sur votre machine

Dans votre terminal, tapez : git --version

Quelques méthodes d'installation en ligne de commande

# 2. Installation

# 2.2 Avec une interface graphique (GUI)

Si la ligne de commande n’est pas encore votre tasse de thé, ne craignez rien ! Il existe des interfaces graphiques qui vous permettent d’utiliser Git de manière visuelle.

Quelques logiciels à interface graphique suggérés

L’organisation qui chapeaute Git recense plusieurs logiciels dans cette catégorie. (Attention, la plupart de ces logiciels ne sont que des interfaces qui nécessitent l’installation de Git séparément !)

Exemple de répertoire de travail suivi avec Git avec une interface graphique

Exemple de répertoire de travail suivi avec Git avec une interface graphique

# 3. Créer un projet en utilisant Git

  1. Créez un nouveau dossier pour votre projet.
  2. Ajoutez des fichiers.
  3. Commencez à versionner avec Git !
Exemple de répertoire pour un projet de rédaction d’article

Exemple de répertoire pour un projet de rédaction d’article

# 3. Créer un projet en utilisant Git

# Quelques définitions

Exemple d’un fil de commits :

Fil de commits par Margot Mellet pour son carnet d’écriture (CC0 1.0 universel - domaine public)

Fil de commits par Margot Mellet pour son carnet d’écriture (CC0 1.0 universel - domaine public)

Qu’est-ce qu’un commit ?

Un commit consiste en une série d’informations :

Pour comprendre comment fonctionne Git, il faut comprendre ce qu’est un commit : ce n’est pas un enregistrement classique, mais l’état du projet tout entier après une série de modifications sur un ou plusieurs fichiers. C’est comme prendre une «  photo  » d’un dossier à un instant donné : on peut revenir à tout moment à cette photo – ou à la photo d’un seul fichier !

# Exercice (en ligne de commande)

Dans un dossier mon-projet/ :

  1. git init pour initialiser un dépôt Git dans ce dossier.
  2. Créez un nouveau fichier nommé article.md.
  3. git status – qu’est-ce que vous voyez ?
  4. git add article.md – vous indexez votre nouveau fichier dans les modifications à venir !
  5. git commit -m "le message d'enregistrement" – validez votre enregistrement.
  6. git log (touche q pour sortir) – qu’est-ce que vous voyez ?
Exemple d’état d’un dépôt après une première validation dans une interface graphique

Exemple d’état d’un dépôt après une première validation dans une interface graphique

Exemple d’état d’un dépôt après plusieurs commits (rondes de modifications) dans une interface graphique

Exemple d’état d’un dépôt après plusieurs commits (rondes de modifications) dans une interface graphique

Exemple d’état d’un dépôt après plusieurs commits, visualisation dans le terminal (avec la commande git log)

Exemple d’état d’un dépôt après plusieurs commits, visualisation dans le terminal (avec la commande git log)

Hourra ! Nous avons l’historique de notre projet localement, sur notre ordinateur. Cependant, il serait plus pratique d’ajouter une synchronisation externe.

# 4. Les plateformes d’hébergement Git (GitHub / GitLab / FramaGit / …)

Les plateformes comme GitHub ou GitLab sont des services en ligne qui permettent d’héberger vos projets versionnés avec le protocole Git.

Avec Git, vous pouvez facilement passer d’un fournisseur à l’autre, et même en utiliser plusieurs à la fois !

Nous commencerons avec GitHub, qui est un service populaire et gratuit.

Exemple de page d’accueil d’un dépôt Git, sur la plateforme GitHub :

Dépôt du carnet d’écriture de Margot Mellet (CC0 1.0 universel - domaine public)

Dépôt du carnet d’écriture de Margot Mellet (CC0 1.0 universel - domaine public)

Git ≠ GitHub

Attention ! Git (le logiciel) n’est pas synonyme GitHub/GitLab/… (des plateformes qui s’appuient sur ce logiciel).

Schéma d’une organisation simple qui distribue les copies d’un projet de manière centralisée

Schéma d’une organisation simple qui distribue les copies d’un projet de manière centralisée

# 4. Les plateformes d’hébergement Git (GitHub / GitLab / FramaGit / …)

# 4.1 Commencer avec GitHub

  1. Créez un compte sur GitHub.com
  2. Créez un dépôt nommé projet-debogue. N’initialisez pas le dépôt (décochez cette option).
  3. Explorez l’interface : Qu’observez-vous de différent par rapport aux propriétés du logiciel Git ? Qu’est-ce qui est similaire ?
  4. Copiez l’URL de clonage via le bouton Code.
  5. Ajoutez une synchronisation, en ligne de commande ou via l’interface graphique.

… mais avant de pouvoir faire la synchronisation, il va falloir configurer Git sur votre poste !

# 5. Configurer Git

# 5.1. Configuration générale

Comme beaucoup d’outils, Git nécessite quelques réglages préalables ! Il est aussi possible de ajouter des configurations spécifiques pour un projet en particulier.

Git repose sur la reconnaissance des personnes qui contribuent ensemble à un même projet, il est donc primordial de bien identifier qui est qui. Pour cela il faut au moins une adresse électronique, mais avec un nom ou un pseudonyme on gagne en lisibilité.

Il est aussi possible de spécifier beaucoup d’autres paramètres, comme l’éditeur de texte par défaut qui sera utilisé pour les messages des merges. Par exemple : git config --global core.editor /usr/bin/vim (sur Windows il faut préciser le chemin complet de l’éditeur de texte).

# 5. Configurer Git

# 5.2. Les clés SSH

Pour en savoir plus, lire la documentation fournie par GitHub.

Protocoles utilisés par Git

Nous nous concentrons sur SSH, mais Git peut en réalité utiliser quatre protocoles distincts pour transférer des données :

# 5. Configurer Git

# 5.3. Générer une paire de clés SSH

Différents algorithmes peuvent être utilisés pour générer une clé SSH. Ces algorithmes correspondent à différents modèles de cryptage de la clé.

Pour en savoir plus, lire la documentation fournie par GitHub.

# 5. Configurer Git

# 5.4 Installer une clé SSH

Lorsque vous aurez généré votre paire de clés, il faudra ajouter votre clé publique (id_rsa.pub) à votre compte GitHub.

  1. Sur GitHub, naviguez aux paramètres de votre compte (Settings).
  2. Dans la section SSH keys, ajoutez une nouvelle clé SSH.
  3. À l’écran de l’ajout d’une nouvelle clé, collez le contenu de votre clé publique (~/.ssh/id_rsa.pub) dans le champ Key.
  4. Donnez un nom à cette clé (une clé est normalement associée à un ordinateur), par exemple Alice@portable-perso ou Bob@ordi-de-bureau.
  5. Assurez-vous que la clé est de type Authentication Key.
  6. Cliquez sur le bouton Add SSH Key.

Voilà ! Vous devriez maintenant avoir les droits d’accès depuis votre poste. Si vous avez trouvé cette étape complexe, n’ayez crainte : vous n’avez qu’à la faire la première fois !

# 6. Les commandes les plus usuelles

Affichage de l’historique en ligne de commande

Pour afficher un historique plus détaillé :

git log --decorate=full --raw

Ou pour afficher l’arbre des branches :

git log \
  --branches \
  --remotes \
  --tags \
  --graph \
  --oneline \
  --decorate \
  --pretty=format:"%h - %ar - %s"

Le concept de branche est une fonctionnalité bien pratique pour maintenir différentes versions d’un même projet.

# 6.1. Quelques commandes avancées

# Conclusion

Voilà ! Vous avez appris les rudiments de Git. Il ne vous reste plus qu’a l’employer dans vos propres projets.

Vous pouvez poursuivre la leçon pour des cas d’utilisation plus pointus (et tout à fait utiles !).

# 7. Conflits, merge, rebase, forks

# 7. Conflits, merge, rebase, forks

# 7.1. Un conflit : choisir/arbitrer

# 7. Conflits, merge, rebase, forks

# 7.2. Exercice : gestion d’un conflit

Suite à l’exercice 1, nous allons créer plusieurs modifications :

  1. créer une nouvelle branche appelée modifs : git branch modifs et puis git checkout modifs
  2. vous êtes désormais sur cette nouvelle branche
  3. modifier le fichier, par exemple : echo "Autre texte hop là" >fichier-01.txt
  4. enregistrer vos modifications dans Git : git commit -a -m "révision de la première ligne"

# 7. Conflits, merge, rebase, forks

# 7.3. Exercice pt 2 : gestion d’un conflit

  1. retourner sur la branche principale : git checkout master (ou git checkout main selon votre configuration)
  2. effectuer une nouvelle modification : echo "Ceci est mon texte" >fichier-01.txt
  3. enregistrer vos modifications : git commit -a -m "réécriture"
  4. tenter de fusionner les deux branches : git merge modifs

Vous devez avoir un conflit !

Vous devez ouvrir le fichier pour résoudre le conflit :

# 7. Conflits, merge, rebase, forks

# 7.4. Git merge

Source

# 7. Conflits, merge, rebase, forks

# 7.5. Git rebase

Source

# 7. Conflits, merge, rebase, forks

# 7. Conflits, merge, rebase, forks

# 7.6. Forks : comment maintenir sa version à jour ?

  1. Créer un Fork du projet sur votre compte GitHub.
  2. Cloner le dépôt sur votre ordinateur (dans un autre dossier que le projet précédent).
  3. Ajouter l’indication du fork en local : git remote add upstream git@gitlab.chemin-du/projet.
  4. Pour récupérer les modifications du dépôt d’origine : git fetch upstream.
  5. Pour synchroniser ces modifications avec votre dépôt : git rebase upstream/master.

# 7. Conflits, merge, rebase, forks

# 7.7. Rebase : les bonnes pratiques difficiles à mettre en place

Un tutoriel complexe à explorer si vous êtes motivé·e :

https://git-rebase.io

# Conclusion

Vous avez passé à travers une montagne d’information – ouf ! Ne soyez pas dur·e·s avec vous-mêmes : Git est un système complexe qui nécessite un apprentissage continu dans la durée. Même les experts ne connaissent généralement qu’une fraction de son fonctionnement.

Toutefois, tous peuvent l’utiliser, et nous espérons que vous saurez bénéficier de ce qu’il a à offrir.