Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

Chapitre 115 minDébutant

C'est quoi Git ? Gestion de versions et GitHub

Par Josselyn C., prof de BTS SIO. Mis à jour le .

À la fin de ce chapitre, tu sauras

  • expliquer ce qu'est la gestion de versions et ce que Git enregistre ;
  • distinguer Git de GitHub, et un système centralisé d'un système distribué ;
  • employer le vocabulaire de base : dépôt, commit, branche, dépôt distant ;
  • installer et configurer Git la première fois.

3 exercices corrigés1 schéma

Git est un logiciel de gestion de versions : il enregistre l'historique complet des modifications d'un projet, permet de revenir à n'importe quel état passé et de travailler à plusieurs sur les mêmes fichiers sans s'écraser. GitHub est un site qui héberge des dépôts Git en ligne et ajoute des outils de travail en équipe. Ce chapitre explique ce que résout un gestionnaire de versions, la différence entre Git et GitHub, où tu croiseras Git au BTS SIO, puis comment installer et configurer Git sur ta machine.

Le problème : projet-final-VRAIMENT-final.zip

Tu as sans doute déjà vécu cette scène. Un projet qui marche, une modification « rapide », et plus rien ne fonctionne. Tu ne sais plus ce que tu as changé. Pour t'en protéger, tu as pris l'habitude de copier ton dossier : projet, projet-v2, projet-final, projet-final-2, projet-VRAIMENT-final. À deux, c'est pire : vous vous envoyez des archives par messagerie, chacun modifie sa copie, et au moment de tout rassembler, il faut comparer les fichiers ligne à ligne en espérant ne rien oublier.

Ces copies posent quatre problèmes :

  • Pas de trace. Une copie ne dit ni ce qui a changé, ni pourquoi, ni qui l'a fait.
  • Pas de retour fiable. Revenir en arrière, c'est deviner quelle copie était la bonne.
  • Pas de travail parallèle. Deux personnes qui modifient le même fichier finissent par écraser le travail de l'autre.
  • Pas de sauvegarde sérieuse. Tout vit sur un seul disque ou dans une messagerie.

Un gestionnaire de versions (on dit aussi logiciel de gestion de versions, ou VCS pour Version Control System) règle ces quatre problèmes. Chaque fois que tu le décides, il prend une photo de ton projet, la date, l'attribue à son auteur et la range avec un message qui explique le changement. Ces photos s'appellent des commits, et leur suite forme l'historique du projet.

Ce que Git enregistre vraiment

Un commit n'est pas une copie bête du dossier. Git stocke le contenu de chaque fichier une seule fois : si un fichier n'a pas changé entre deux commits, le second réutilise simplement la version déjà enregistrée. C'est pour cette raison qu'un dépôt de plusieurs années reste léger.

Chaque commit contient :

  • l'état de tous les fichiers suivis au moment du commit ;
  • le nom et l'adresse e-mail de l'auteur, la date ;
  • le message qui décrit le changement ;
  • un lien vers le commit précédent, son parent (deux parents pour un commit de fusion).

Git calcule pour chaque commit une empreinte de 40 caractères hexadécimaux, par exemple 0f0c3b3a9e…, avec la fonction de hachage SHA-1. Cette empreinte, qu'on appelle le SHA ou le hash du commit, l'identifie de façon unique : la moindre modification du contenu, du message ou du parent donne une empreinte différente. Dans la pratique, tu n'en tapes que les 7 premiers caractères (0f0c3b3), que Git affiche dans ses résumés.

Centralisé ou distribué

Il existe deux familles de gestionnaires de versions.

Dans un modèle centralisé, comme Subversion (SVN), l'historique vit sur un seul serveur. Chaque développeur n'a sur sa machine que la dernière version des fichiers. Pour enregistrer une modification ou consulter l'historique, il faut joindre le serveur : sans réseau, on ne peut rien faire, et si le serveur meurt sans sauvegarde, l'historique est perdu.

Dans un modèle distribué, comme Git, chaque développeur possède une copie complète du dépôt, historique compris. Tu commites, tu consultes l'historique, tu crées des branches sans connexion. Tu ne te synchronises avec les autres que quand tu le décides, en envoyant tes commits (push) et en récupérant les leurs (pull). Chaque copie est aussi une sauvegarde de tout le projet.

CritèreCentralisé (SVN)Distribué (Git)
Où vit l'historiqueSur le serveur uniquementSur chaque poste et sur le serveur
Travail hors ligneLecture des fichiers seulementCommits, historique, branches
VitesseChaque opération passe par le réseauPresque tout est local, donc instantané
BranchesCopies de dossiers, lourdesPointeurs légers, créées en une commande
Panne du serveurL'historique est perdu sans sauvegardeN'importe quel clone permet de tout reconstruire

Git a été créé en 2005 par Linus Torvalds pour gérer le code du noyau Linux, puis confié à une communauté de développeurs. Il est libre et gratuit, et c'est aujourd'hui le gestionnaire de versions de l'immense majorité des projets, des petites applications d'entreprise jusqu'à Windows et Android. SVN existe encore dans des entreprises qui ne l'ont pas migré, mais tu n'as pas besoin de l'apprendre.

Quelle différence entre Git et GitHub ?

C'est la confusion la plus fréquente. Git est le logiciel installé sur ta machine : il gère l'historique en local, en ligne de commande ou à travers ton éditeur. GitHub est un service Web, appartenant à Microsoft depuis 2018, qui héberge des dépôts Git sur ses serveurs. Il ajoute ce que Git ne fait pas seul : une interface Web, les pull requests pour relire le code avant de l'intégrer, les issues pour suivre les bugs et les tâches, l'intégration continue avec GitHub Actions, l'hébergement de sites avec GitHub Pages.

Tu peux utiliser Git sans jamais aller sur GitHub. L'inverse est impossible : GitHub ne fait que stocker et afficher des dépôts Git.

Poste de LinaGit installédépôt sorbier-fraishistorique completgit pushgit pullPoste de HugoGit installédépôt sorbier-fraishistorique completgit pushgit pullGitHub (en ligne)dépôt de référencepull requestsissuesGitHub ActionsGitHub Pagesce que Git seul ne fait pas
Git vit sur chaque poste ; GitHub héberge la copie de référence et ajoute les outils d'équipe

On appelle forge un service comme GitHub. Il en existe plusieurs, et tu en croiseras d'autres en stage :

ForgeHébergementCe qu'il faut savoir
GitHubEn ligne (Microsoft)La plus utilisée, en particulier pour les projets libres et les portfolios ; offre gratuite large, pack étudiant
GitLabEn ligne ou installé sur les serveurs de l'entrepriseTrès présent en entreprise et dans les administrations ; intégration continue intégrée (GitLab CI) ; on y parle de merge request
Gitea et ForgejoInstallés sur ton propre serveurLégers et libres, ils tournent sur une petite VM : parfaits pour un labo de BTS ou une PME qui veut garder son code chez elle
BitbucketEn ligne (Atlassian)Choisi par les équipes qui utilisent déjà Jira et Confluence
Azure DevOpsEn ligne (Microsoft)Présent dans les entreprises tournées vers .NET et Azure

Toutes ces forges hébergent des dépôts Git : les commandes de ce cours sont les mêmes partout. Seuls les noms des fonctions de l'interface changent (GitLab et Gitea : les équivalences).

Le vocabulaire de base

TermeDéfinition
Dépôt (repository, repo)Un projet suivi par Git : tes fichiers plus le dossier caché .git qui contient tout l'historique
CommitUn enregistrement de l'état du projet, avec un auteur, une date, un message et une empreinte unique
HistoriqueLa suite des commits, chacun relié à son parent
BrancheUne ligne de travail indépendante ; techniquement, une étiquette qui pointe vers un commit (chapitre 5)
HEADLe repère « tu es ici » : la branche, donc le commit, sur lequel tu travailles
Dépôt distant (remote)Une autre copie du dépôt, en général sur une forge ; la principale s'appelle origin par convention
ClonerCopier un dépôt distant sur ta machine, historique compris
Push, pullEnvoyer tes commits vers le distant, récupérer ceux des autres (chapitre 8)
Fusionner (merge)Réunir le travail de deux branches (chapitre 5)
ConflitDeux modifications incompatibles de la même zone d'un fichier, que tu dois arbitrer (chapitre 6)

Git au BTS SIO

Git n'est pas une option. Au BTS SIO, il sert dans les deux blocs professionnels.

  • Bloc 1, commun aux deux options, évalué à l'E5. La compétence « Travailler en mode projet » demande de planifier, de répartir et de suivre des tâches : les issues, les tableaux de projet et l'historique d'une forge en sont des traces datées. Un historique Git montre aussi qui a fait quoi dans un projet d'équipe (cours sur l'E5).
  • Bloc 2 SLAM, évalué à l'E6. Les compétences citent explicitement « Intégrer en continu les versions d'une solution applicative » et « Recueillir, analyser et mettre à jour les informations sur une version d'une solution applicative ». L'environnement technologique exigé par le référentiel (annexe II.E) comprend « un logiciel de gestion de versions et de suivi des problèmes » : concrètement, Git et les issues d'une forge (compétences évaluées à l'E6).
  • Option SISR. Les administrateurs versionnent aussi leurs scripts PowerShell et Bash, leurs fichiers de configuration, leurs fichiers Docker Compose et leurs playbooks Ansible. Un script de création de comptes qui casse en production se répare beaucoup plus vite quand on sait ce qui a changé et quand.

Pendant l'heure de réalisation de l'E6 SLAM, tu travailles sur ton propre dépôt : tu crées une branche, tu commites après chaque étape qui marche et tu montres ton historique à la commission (la phase 2 de l'E6). Le chapitre 13 explique comment préparer ce dépôt.

Installer Git

Vérifie d'abord si Git est déjà présent. Ouvre un terminal (PowerShell ou Git Bash sous Windows, Terminal sous macOS et Linux) :

bash
git --version
text
git version 2.56.0

Le numéro exact importe peu : toute version sortie depuis 2020 convient pour ce cours. Si la commande est inconnue, installe Git :

SystèmeInstallation
Windowswinget install --id Git.Git -e dans PowerShell, ou l'installeur de git-scm.com. Il fournit Git Bash, un terminal qui comprend les commandes Unix (ls, cat, rm) utilisées dans ce cours, et le gestionnaire d'identifiants qui retient ta connexion à GitHub
macOSxcode-select --install installe la version d'Apple, souvent un peu ancienne ; brew install git donne la dernière avec Homebrew
Debian, Ubuntusudo apt update && sudo apt install git
Fedora, Rocky Linuxsudo dnf install git

Configurer Git la première fois

Git signe chaque commit avec un nom et une adresse e-mail. Règle-les une fois pour toutes sur ta machine :

bash
git config --global user.name "Lina Morel"
git config --global user.email "lina.morel@example.com"

--global enregistre le réglage pour tous tes dépôts, dans le fichier ~/.gitconfig de ton compte. Sans --global, le réglage ne vaut que pour le dépôt courant : pratique pour utiliser ton adresse d'entreprise dans le dépôt de ton stage. Utilise l'adresse de ton compte GitHub, sinon GitHub ne relie pas tes commits à ton profil.

Trois autres réglages t'éviteront des surprises :

bash
# Nommer main la branche créée par git init (le nom par défaut de GitHub)
git config --global init.defaultBranch main

# Choisir l'éditeur qui s'ouvre pour les messages longs (ici VS Code, qui attend la fermeture de l'onglet)
git config --global core.editor "code --wait"

# Faire de git pull une récupération suivie d'un rebase plutôt que d'une fusion (expliqué au chapitre 7)
git config --global pull.rebase true

Sans réglage de l'éditeur, Git ouvre souvent Vim. Si tu t'y retrouves coincé, tape Échap, puis :wq et Entrée pour enregistrer et quitter, ou :q! pour quitter sans enregistrer. Si tu préfères Nano, plus simple dans un terminal : git config --global core.editor nano.

Pour relire ta configuration :

bash
git config --global --list
text
user.name=Lina Morel
user.email=lina.morel@example.com
init.defaultbranch=main
core.editor=code --wait
pull.rebase=true

Et pour savoir d'où vient un réglage (global, local au dépôt ou système) : git config --show-origin user.email.

Exercices

Exercice 1 sur 3 Git ou GitHub ? Réussi À revoir

Pour chaque action, dis si elle relève de Git (le logiciel local), de GitHub (le service en ligne) ou des deux.

  1. Enregistrer un commit dans le train, sans réseau.
  2. Demander à un camarade de relire ton code avant de l'intégrer à la branche principale.
  3. Afficher l'historique des modifications d'un fichier.
  4. Signaler un bug et l'assigner à un membre de l'équipe.
  5. Envoyer tes commits pour qu'Hugo puisse les récupérer.
  6. Lancer automatiquement les tests à chaque envoi de code.
Voir la réponseMasquer la réponse de l'exercice 1
  1. Git : le commit est une opération locale, aucune connexion n'est nécessaire.
  2. GitHub : c'est une pull request, une fonction de la forge.
  3. Git : git log -- fichier lit l'historique local. GitHub l'affiche aussi, mais Git suffit.
  4. GitHub : c'est une issue.
  5. Les deux : la commande git push est une commande Git, et GitHub reçoit et stocke les commits.
  6. GitHub : c'est GitHub Actions (chapitre 12).

Tu avais trouvé ?

Exercice 2 sur 3 Centralisé ou distribué Réussi À revoir

Le serveur qui héberge le dépôt de l'équipe tombe en panne définitivement, sans sauvegarde. L'équipe compte trois développeurs, qui avaient tous récupéré le dernier état du projet la veille.

  1. Que perd l'équipe si elle utilisait SVN ?
  2. Que perd-elle si elle utilisait Git ?
  3. Avec Git, comment remet-elle un dépôt de référence en service ?
Voir la réponseMasquer la réponse de l'exercice 2
  1. Avec SVN, l'historique n'existait que sur le serveur : l'équipe le perd entièrement. Il ne lui reste que la dernière version des fichiers sur chaque poste, sans aucune trace des versions précédentes.
  2. Avec Git, presque rien : chaque développeur possède une copie complète du dépôt, historique compris. Seuls les commits poussés par quelqu'un après la dernière récupération des autres manquent, et leur auteur les a encore sur son poste.
  3. Elle crée un nouveau dépôt vide sur une forge (ou un serveur), puis un développeur y pousse sa copie : git remote set-url origin <nouvelle-url> puis git push -u origin --all et git push origin --tags. Les autres changent l'adresse de leur distant avec la même commande git remote set-url.

Tu avais trouvé ?

Exercice 3 sur 3 Configuration Réussi À revoir

Tu viens d'installer Git sur ton ordinateur personnel. Écris les commandes qui :

  1. affichent la version installée ;
  2. règlent ton nom et ton adresse pour tous tes dépôts ;
  3. font en sorte que git init crée une branche main ;
  4. affichent tous tes réglages globaux.

Puis réponds : à ton stage, l'entreprise te demande de signer tes commits avec ton adresse professionnelle dans son dépôt, sans changer ton adresse personnelle ailleurs. Quelle commande lances-tu, et où ?

Voir la réponseMasquer la réponse de l'exercice 3
bash
git --version
git config --global user.name "Prénom Nom"
git config --global user.email "adresse@example.com"
git config --global init.defaultBranch main
git config --global --list

Pour le stage, place-toi dans le dossier du dépôt de l'entreprise et lance git config user.email "prenom.nom@entreprise.fr", sans --global. Le réglage est écrit dans le fichier .git/config de ce dépôt seulement, et il l'emporte sur le réglage global.

Tu avais trouvé ?

Chapitre terminé !

Fais les 3 exercices avant de passer à la suite : c'est en t'entraînant que tout se fixe.

chapitres
–
de série
–
du cours
–
Chapitre suivant : Les commandes Git de base : init, add, commit, logRevoir le sommaire du cours