Chapitre 3 Utiliser GIT
avec
Cette formation ne nécessite pas de connaissances avancées en R
, voire aucune car elle s’appuie uniquement sur les fonctionnalités de RStudio
. À toute fin utile, la documentation utilitR constitue une ressource
qu’il peut être intéressant de consulter en complément.
3.1 Pourquoi utiliser la gestion de version ?
Nos travaux statistiques évoluent constamment (productions annuelles, nouvelles enquêtes, etc.) et nous travaillons souvent à plusieurs. En outre, le maintien de la qualité de nos chaînes de traitement nécessite un archivage détaillé et facilement accessible.
Tous les statisticiens se sont déjà demandé (ou à leurs collègues) :
- quelle était la bonne version d’un programme
- qui était l’auteur d’un bout de code en particulier
- si un changement était important ou juste un essai
- comment fusionner des programmes
- etc.
Souvent l’organisation des programmes partagés est une gageure et ressemble à une longue liste d’archivages manuels et arbitraires.
Exemple d’une organisation de fichiers à l’ancienne
Pourtant, il existe un outil informatique puissant afin de répondre à tous ces besoins : la gestion de version (version control system (VCS) en anglais). Ses avantages sont incontestables et permettent de facilement :
- enregistrer l’historique des modifications d’un ensemble de fichiers
- revenir à des versions précédentes d’un ou plusieurs fichiers
- rechercher les modifications qui ont pu créer des erreurs
- partager ses modifications et récupérer celles des autres
- proposer des modifications, les discuter, sans pour autant modifier la dernière version existante
- identifier les auteurs et la date des modifications
En outre, ces outils fonctionnent avec tous les langages informatiques (texte, R, Python, SAS, \(\LaTeX\), Java, etc.) car reposent sur la comparaison des lignes et des caractères des programmes, indépendamment du langage.
En bref, c’est LA bonne manière pour partager des codes et travailler à plusieurs sur un projet statistique (études ou production).
3.1.1 Conserver et archiver du code
Une des principales fonctionnalités de la gestion de version est conserver l’ensemble des fichiers de façon sécurisée et de proposer un archivage structuré des codes. Les fichiers sont stockés dans un dépôt, qui correspond au projet (par exemple, le modèle Ines). C’est là où sont stockéees toutes les informations utiles au partage des codes.
Dans la gestion de version, tout repose dans la comparaison des changements dans les programmes et la présentation de l’historique de ces modifications. Chaque modification (ajout, suppression ou changement) sur un ou plusieurs fichiers est identifiée par son auteur, sa date et un bref descriptif1. Chaque changement est donc unique et aisément identifiable quand ils sont classés par ordre chronologique par exemple. Les modifications transmises au dépôt commun sont appelées commit. Cette étape joue un rôle central et sera détaillée plus loin.
Un exemple d’historique d’un projet sur GitLab issu du projet utilitR
Un exemple d’historique d’un projet via RStudio
Avec la gestion de version, sur son poste de travail, les dizaines (centaines ?) de programmes organisés à la main n’existent plus. Tout est regroupé dans un seul dossier, rassemblant les éléments du dépôt à une date donnée, généralement la plus récente. Au sein du dépôt, tout l’historique est stocké et accessible rapidement. Si l’on souhaite travailler sur la dernière version des programmes (ou sur une ancienne version spécifique), il n’y a plus besoin de conserver les autres fichiers car ils sont dans l’historique du projet. Il est alors possible de choisir sur quelle version on veut travailler (la dernière commune à tout le monde, la sienne en train d’être développée, celle de l’année dernière, etc.).
3.1.2 Travailler efficacement en équipe
Le deuxième avantage de la gestion de version représente une amélioration notable du travail en équipe sur des codes en commun. Que ce soit au sein d’un modèle cogéré (Ines, Destinie, etc.), de gros projets (Nautile) ou de chaînes de traitement récurrentes (enquête emploi, comptes trimestriels, etc.), la collaboration est courante lors des travaux statistiques. La gestion de version permet de collaborer simplement et avec méthode. De façon organisée, elle permet de:
- travailler en parallèle et fusionner facilement du code
- partager une documentation des programmes grâce :
- aux commentaires des modifications
- à la possibilité d’une documentation commune et collaborative
- trouver rapidement des erreurs et en diffuser rapidement la correction
Exemple de détails d’une modification
L’usage individuel, c’est-à-dire seul sur son projet, permet aussi de “travailler en équipe avec soi même” car il permet de retrouver des mois plus tard le contenu et le contexte des modifications. Cela est notamment précieux lors des changements de poste ou des travaux réguliers mais espacés dans le temps (par exemple, un mois par an chaque année).
Même en travaillant seul sur un projet, on collabore avec un moi futur (qui aura vraisemblablement oublié le contenu ou la raison de la modification des fichiers). Donc il est également recommandé de travailler en gestion de version sur un projet individuel.
3.1.3 Améliorer la qualité des codes
Le fonctionnement de la gestion de version, reposant sur l’archivage structuré des modifications et les commentaires les accompagnant, renforce la qualité des programmes informatiques. Ils sont plus documentés, plus riches et mieux structurés. C’est pour cette raison que le contrôle de version est un outil puissant pour toute production statistique : toute personne travaillant sur des programmes, SAS
y compris, gagne à utiliser du contrôle de version.
Quand il s’agit de modèles statistiques, ou de chaînes de traitement statistique, constitués de nombreux programmes, la gestion de version permet :
- l’amélioration de la qualité des modèles par des méta-données riches,
- un gain de place pour stocker les historiques,
- leur diffusion simplifiée et harmonisée.
En outre, lors de l’ouverture des modèles au format open source par exemple, leur diffusion publique correspond aux standards des communautés de logiciels libres et aux usages recommandés pour documenter des programmes informatiques. Cela permet aux utilisateurs ou aux agents découvrant des chaînes de traitement de mieux s’approprier les programmes.
3.1.4 Usage quotidien : un exemple avec le modèle Ines
Le modèle Ines est co-développé par l’Insee et la Drees ainsi que la Cnaf depuis 2018. Sous licence libre, il est disponible en open-source. Il est organisé dans une forge qui regroupe le code, un wiki, une documentation, un forum et différents outils collaboratifs (ces éléments seront présentés plus loin). Les utilisateurs y ont accès via la plateforme Adullact. Le dépôt regroupe donc les programmes, l’historique des modifications et les archives des différentes versions (‘Ines 2018’ par exemple). Les chargés d’étude ont une copie locale du projet sur leur poste de travail. Les changements sont mis à jour et disponibles en temps réel.
Envoi d’une modification avec TortoiseSVN : commit
Historique d’un fichier ou dossier : log
Recherche efficace une erreur : blame
D’une manière générale, il existe plusieurs manières d’utiliser le contrôle de version :
- en ligne de commande, via git bash, par exemple ;
- avec une interface graphique spécialisée, par exemple tortoise git ou GitHub Desktop ;
- avec un logiciel de développement : la plupart des logiciels de développement (RStudio pour
R
, PyCharm ou jupyter pourpython
, atom, etc.) proposent tous des modules graphiques facilitant l’usage degit
dont les fonctionnalités sont très proches.
Dans ce support, nous présentons le contrôle de version via RStudio
, la solution que nous recommandons en raison de sa simplicité. Elle rend le recours à la ligne de commande marginal voire inutile. Elle est également plus rapide et facilement implémentable à l’Insee.
3.1.5 Avec ou sans gestion de versions
Le tableau suivant compare les usages au temps (pré-historique ?) de la programmation sans gestion de version avec les modes de travail si on y a recours :
Avant | Gestion de version | |
---|---|---|
Archivage | à la main | automatique |
Envoi de modification | mail, dossier partagé | code partagé |
Fusion de code | copié-collé | simple, sûr |
Versions du modèle | dossiers archivés | historique riche |
Gestion des erreurs | à la main | méthodique |
Beaucoup de supports existent en ligne, il faut parfois s’en méfier car les usages peuvent différer et sont souvent spécifiques aux usages et aux installations (cf. infra). Cette présentation Git for humans didactique courte mais en anglais présente les avantages de l’usage de GIT
.
En conclusion, que ce soit au sein d’un travail collaboratif en équipe ou sur ses propres projets individuels, notre temps est consacré à la programmation réellement utile. Plus de temps perdu ! L’organisation du travail est efficace grâce :
- aux améliorations rapides des codes
- au partage efficace des tâches
- à la recherche puissante des erreurs
- à un archivage géré automatiquement avec des méta-données
- à des outils généralisés et documentés en ligne.
La gestion de version est donc le meilleur moyen de partager du code (entre équipes internes, lors des changements de poste, pour l’archivage, lors de l’ouverture au libre, etc.). Ces outils viennent du développement informatique et de la création des logiciels et applications. Les traitements statistiques sont également des chaînes informatiques et sont donc pleinement adaptés pour s’appuyer sur les outils de gestion de version.
3.2 Configurer un projet GIT
avec RStudio à l’Insee
Dans une configuration classique, la première étape consisterait à installer le logiciel GIT
sur son poste. C’est par exemple le cas sur son ordinateur personnel ou sur son poste de travail local. Cependant, cette formation adopte un cadre de travail sécurisé et partagé, permettant à la fois d’utiliser la version de RStudio
recommandée et d’avoir accès aux coffres. Elle peut se dérouler sur le serveur de calcul AUS interne à l’Insee ou sur le datalab du SSP. C’est aussi certainement le cadre de travail classique sur des projets collaboratifs avec d’autres collègues. Ce support présente la configuration spécifique à AUS comme cadre par défaut mais fournit également des éléments pour le cas d’un projet sur poste local.
La seconde brique afin de pouvoir travailler sur un projet partagé est le choix de la plateforme où est stocké le repository
. Cela peut être sur github.com
, gitlab.com
ou une autre forge en ligne. À l’Insee, il est recommandé de s’appuyer sur le GitLab
interne.
Que ce soit sur les sites externes de type gitlab.com
ou la plateforme innovation, il est d’abord nécessaire de créer son accès puis ensuite de configurer l’acccès au GitLab
. Ces manipulations sont à faire une et une seule fois pour un poste de travail donné, ce sont les étapes de configuration. Ensuite, les manipulations pour accéder à un projet déjà existant sont plus simples et automatisées.
3.2.1 La première fois
La section qui suit présente l’étape fondamentale pour pouvoir lire et modifier un dossier partagé sur un dépôt commun stocké sur un GitLab
. Cette plateforme est un outil de stockage et de gestion des projets mis en commun via Git
.
3.2.1.1 Accéder au GitLab
de l’Insee
Une version interne de GitLab
est disponible à l’Insee sur gitlab.insee.fr. Pour accéder à son profil sur le GitLab
de l’Insee, il est nécessaire de se connecter avec son profil individuel. Pour y accéder, il suffit de cliquer sur Sign In
en haut à droite:
3.2.1.2 Recommandation concernant l’authentification HTTPS vs SSH
L’étape suivante de configuration est de créer un lien sécurisé entre le profil utilisateur distant et le poste de travail (local ou AUS). Pour cela, il existe deux possibilités l’authentification via HTTPS
ou via SSH
.
En dehors des infrastructures Insee, il est généralement plus simple d’utiliser l’authentification HTTPS
que SSH
, notamment lorsqu’on interagit avec Gitlab.com
car il suffit de rentrer login/password
lorsqu’on interagit avec un dépôt. La fiche utilitR présente avec plus de détails ces concepts et des recommandations de sécurité adaptées, par exemple sur la manière d’enregistrer un jeton HTTPS
pour ne pas avoir à le fournir à chaque authentification ou pour utiliser l’authentification SSH.
À l’Insee, le wiki d’AUSV3
décrit toutes les étapes (à suivre à la lettre et pas à pas) pour configurer l’utilisation de Git
avec AUS par l’intermédiaire SSH
. Cette manipulation tient lieu d’installation pour pouvoir échanger avec le dépôt distant et est donc à faire une seule fois par poste (local, AUS ou personnel en dehors des projets Insee).
3.2.2 Au lancement de chaque projet, cloner depuis gitlab.insee.fr
Pour pouvoir récupérer un projet disponible sur un dépôt afin de le modifier en local, la première étape consister à récupérer le chemin du dossier partagé, afin de le copier dans son espace de travail (dit local). Il est disponible via le bouton clone
du projet.
Prenons l’exemple du support de cette formation, créé avec RStudio
et GIT
sur la plateforme innovation. Pour récupérer (clone en vocabulaire GIT
) le dossier partagé, il suffit copier l’adresse indiquée sous la boîte Clone with SSH avec l’icône entourée.
Ensuite, il est nécessaire d’indiquer à RStudio
comment se connecter à ce dépôt distant (stocké sur le Gitlab
). Dans “File / New Project,” sélectionner Version control
puis GIT
:
Il suffit ensuite de remplir les trois paramètres :
- Repository URL : coller l’adresse
SSH
copiée depuis leGitLab
- Projet directory name : le nom du dossier où va sera la copie locale du
repository
, c’est là où vous allez modifier les programmes et où se situera votre code - Create project as subdirectory of : le chemin physique où se situera le projet, par exemple
D:/idep
dans le cas d’un projet local.
Cliquer sur Create project
copier les fichiers du dossier partagé et vous permet de travailler sur RStudio
avec l’interface GIT
qui va être décrite dans la partie suivante.
Il est également possible de cloner des dépôts en externe via https
par exemple. Si vous rencontrez des problèmes pour configurer un dépôt, une vidéo d’installation a été produite par le SNDI ainsi qu’une documentation de configuration.
3.3 Des bases de GIT
Les deux outils de gestion de version les plus répandus sont GIT et SVN (pour Subversion). L’Insee a utilisé SVN pendant un temps mais privilégie GIT maintenant en raison de plusieurs avantages, comme le travail hors ligne plus stable, une meilleure flexibilité et une plus grande vitesse (cf. infra).
GIT est un logiciel qui est installé sur son poste et celui de ses collaborateurs. Il est open source, gratuit et très répandu. Ainsi, une vaste documentation est disponible en ligne ou les forums d’entraide de type stackoverflow
(voir par exemple le tag ‘GIT’ ). Sur la plateforme GitHub
, la page de tutoriel regroupe différents supports. Des vidéos pédagogiques sont fournies sur git-scm.com.
Face au foisonnement des pratiques et des ressources en ligne, il est recommandé d’adopter et suivre les bonnes pratiques pour chaque projet, et de prendre avec vigilance ce qui est trouvé en ligne. Les configurations et les habitudes diffèrent et une solution proposée sur un forum ou dans un livre peut ne pas être adaptée dans votre cas précis.
C’est l’objectif de ce support de rassembler les pratiques les plus courantes et présenter l’utilisation recommandée de la gestion de version avec RStudio à l’Insee.
La genèse de Git correspond au noyau du système d’exploitation Linux qui gérait les patchs et les archives pendant les années 1990. À partir de 2005, Linus Torvalds, aussi inventeur de Linux, développe un successeur avec pour objectifs, la vitesse, la simplicité, la possibilité de développements en parallèle (les futures branches), le tout avec un usage compact des données. Depuis, son usage a largement dépassé celui de SVN.
SVN est dit centralisé alors que GIT est dit distribué. Cela signifie notamment que chaque collaborateur possède une copie en propre de l’ensemble du projet sur son poste de travail. Cela implique un avantage important de GIT en terme de sécurité des codes (qui risquent beaucoup moins d’être perdus) et la rapidité des partages des modifications.
En outre, contrairement à SVN pour lequel il faut être connecté à un serveur, il n’est pas besoin d’être connecté avec GIT et on peut travailler en local. Ainsi, on transmet ses modifications quand on le souhaite ou peut et cela facilite le travail distant.
Enfin, un des grands avantages pratiques de GIT
est son intégration native dans l’interface RStudio
(et réciproquement) ainsi que dans les plateformes GitHub
et GitLab
(voir parties ci-après). À l’origine utilisé en ligne de commandes (et utilisé comme tel par les développeurs), les interfaces graphiques actuelles permettent de s’en passer dans l’immense majorité des situations.
3.3.1 Le B.A-BA
Les programmes s’organisent sur un répertoire distant commun (dépôt ou repository) et sont manipulés sur les postes indidivuels dans des dossiers locaux (working directory). Le dépôt distant peut par exemple être hébergé sur une plateforme de type GitLab ou GitHub .
GitHub, GitLab, quesaquo ?
Le travail collaboratif avec Git
s’organise autour d’un serveur auquel chaque contributeur transmet ses modifications et depuis lequel les différents contributeurs récupèrent le travail des collègues.
Comme tout serveur, ceux-ci peuvent être accessibles sur un réseau interne ou être accessibles sur internet. Sur ces serveurs, on installe un logiciel qui offre une interface utilisateur. Il existe différents types d’interface utilisateur, les deux plus populaires s’appelant “GitHub” ou “GitLab.”
Dans le contexte de travail de l’Insee, vous pourrez être amenés à travailler avec différents serveurs que nous différencions ici grâce à leurs adresses web :
- gitlab.insee.fr : serveur interne au réseau de l’Insee avec une interface utilisateur de type “GitLab” maintenu par la DSI de l’Insee (projet SOFA)
- git.lab.sspcloud.fr : serveur du SSP Cloud exposé sur internet avec une interface utilisateur de type “GitLab” maintenu par la division innovation
- github.com : serveur public exposé sur internet avec une interface utilisateur de type “GitHub” maintenu par Microsoft
- gitlab.com : serveur public exposé sur internet avec une interface utilisateur de type “GitLab” maintenu par l’entreprise GitLab
Tous les serveurs Git
connaissent une structure similaire :
- chaque utilisateur possède un espace personnel pour stocker ses projets. Par exemple, sur le serveur GitLab de l’Insee, chaque agent a un espace accessible à l’adresse https://gitlab.insee.fr/IDEP
- il est possible de créer des espaces communs pour une structure ou pour un projet donné. Par exemple, l’Insee dispose d’un espace institutionnel sur GitHub nommé https://github.com/InseeFr qui héberge des projets open source de l’Insee utilisés en production ainsi qu’un espace pour les projets open source expérimentaux nommé https://github.com/InseeFrLab
Les trois manipulations les plus courantes sont les suivantes et représentées sur le diagramme ci-après :
- pull : je récupère la dernière version des codes du dépôt distant
- commit : je valide mes modifications avec un message qui les expliquent
- push : je transmets mes modifications validées au dépôt distant
De manière plus précise, il y a trois étapes avant d’envoyer les modifications validées (commit) au dépôt. Elles se définissent en fonction des commandes qui permet de les appliquer quand Git est utilisé en ligne de commandes :
diff
: inspection des modifications. Cela permet de comparer les fichiers modifiés et de distinguer les fichiers ajoutés ou supprimésstaging area
: sélection des modifications.- commit : validation des modifications sélectionnées (avec commentaire).
L’un des intérêts de git
est que le choix des modifications à soumettre est très fin: il est possible de découper les modifications d’un fichier en plusieurs morceaux cohérents.
Les deux diagrammes ci-dessous représentent ces différences étapes et les commandes qui permet de passer d’un état à l’autre.
Lors d’un commit, le message de validation est très important:
- il décrit brièvement les modifications contenues dans le commit
- il s’adresse aux autres et doit donc être intelligible
Chaque commit doit rassembler des modifications homogènes. Il ne faut donc pas hésiter à séparer les changements qui ne sont pas directement reliés car il est plus facile de rechercher au sein de plusieurs modifications différentes qu’une seule trop vaste.
Chaque commit est identifié de façon unique par un hash (ex: 441300764de91c376
), un numéro peu intelligible pour un humain mais qui permet au système de contrôle de version de gérer proprement chaque modification.
Ensuite, les deux fonctions push et pull permettent la mise à jour du projet local par rapport au distant et réciproquement. C’est donc avec un push qu’on envoie les modifications qui ont été sélectionnées puis validées.
Lors des étapes de push et pull, des conflits peuvent apparaître, par exemple lorsque deux personnes ont modifié le même programme simultanément.
Tout d’abord, il est possible de minimiser l’apparition de conflits en amont en validant souvent les modifications (commit
) :
- en commençant par mettre à jour sa copie locale régulièrement via pull ou fetch, voire dès qu’on commencer à travailler sur un projet
- en regroupant les commit par petits lots homogènes et en préférant peu de fichiers
- en communiquant avec les autres membres de l’équipe en disant sur quoi on travaille et en prévenant en cas de grosse modification
De manière générale, il ne faut pas avoir peur des conflits. Les outils sont faits pour les gérer avec rigueur et méthode (voir les exercices). Avec GIT, il est très rare de faire des bêtises et on peut toujours réparer à condition de s’en tenir aux commandes de base (commit, push, pull et merge).
Cependant, il existe des commandes qui peuvent définitivement endommager votre projet, la plus destructrice étant git push --force
que vous ne devriez jamais utiliser. Faites très attention en lisant des tutoriels en ligne car certains sont à destination d’utilisateurs avancés et recommandent ces commandes “à risque.”
3.3.2 Exercice 1: Premiers pas avec git
en local
Dans le cadre de cette formation, un projet d’exemple a été créé pour vous. L’idée est de former des groupes de deux, chaque groupe représentant une équipe. Vous allez donc travailler en binôme avec votre voisin (ou avec une personne de la visio si la formation n’a pas lieu en présentiel).
Dans cette partie, nous allons adopter un fil rouge en créant un document collaboratif commun et en pratiquant par des exercices les principales situations d’un statisticien qui travaille avec R
et GIT
via RStudio
et GitLab
.
Préliminaire: forker le projet Même si c’est techniquement possible, être plus de 10
à faire des modifications en simultané sur la branche master
est périlleux. Il convient
donc d’éviter d’être tous en même temps sur le même projet.
Pour cela, dans chaque équipe de 2, une personne doit faire un fork qui revient à dupliquer le projet pour chacune des équipes. Pour cela, il faut cliquer en haut à droite du projet exemple, qui sert de base à l’exercice.
La personne qui a initié le fork
(pas besoin d’être deux à le faire) doit
ensuite donner des droits à son/sa binôme (dans members
du menu à gauche ). Accorder le droit de maintainer
pour commencer.
Exercice 1 : Git en local
⚠️ N’oubliez pas qu’il faut avoir fait un fork
du projet.
Pour commencer, tout se passe dans l’onglet git
de RStudio
(en haut à droite) :
Question a. clone
et modification du fichier.gitignore
Clôner le dossier de votre projet d’équipe avec RStudio
via le lien SSH
du projet sur Gitlab
. Ensuite, modifier le fichier .gitignore
en y ajoutant les fichiers .pdf
et au .html
. Penser à sauvegarder le fichier.
Question b. staging
Créer un fichier votre_idep.md
et y écrire une phrase au format, sujet-verbe-complément mais majuscule ni ponctuation. Observer le statut du fichier dans l’onglet git
.
Question c. commit
Valider cet ajout via le bouton commit
en ajoutant un message clair mais bref.
Question d. push
Envoyer cette modification au projet partagé via le bouton push
(flèche verte montante).
:boom: Un des deux membres du groupe (celui qui a été moins rapide) devrait avoir un rejet
du push
. Pas de problème, passer à l’étape suivante (pull
) puis refaire cette étape (push
)
Question e. pull
Récupérer les modifications du dépôt commun (= le fichier de votre voisin à ce stade) via le bouton pull
(flèche bleue descendante).
Question f. commit-push-pull
Recommencer les mêmes opérations modifiant cette fois-ci le fichier de votre voisin. Compléter le texte par une autre phrase.
3.3.3 Les branches : principes
C’est une des fonctionnalités les plus pratiques de la gestion de version. La création de dans un projet (qui devient ainsi un arbre) permet de développer en parallèle des correctifs ou une nouvelle fonctionnalité sans modifier le dépôt commun. Cela permet de séparer le nouveau développement et de faire cohabiter plusieurs versions, pouvant évoluer séparément ou pouvant être facilement rassemblées. Git est optimisé pour le travail sur les branches.
Petite révélation du jour : #git, c'est le meilleur outil pour te rappeler que nous sommes proches des singes : si t'es pas sur une branche, t'es dans la merde
— Nicolas Delsaux (@riduidel) February 18, 2020
Les branches peuvent avoir des durées de vie plus ou moins longues selon leurs objectifs : nouvelle fonctionnalité, résolution de bugs, environnement de développement ou de production, etc.
Trois principales fonctionnalités existent, définies par leur nom de commande :
git branch
: création d’une branchegit checkout
: pour changer de branchegit merge
: fusion de branche
Dans un projet collaboratif, une branche dite master joue le rôle du tronc. C’est autour d’elle que vont pousser ou se greffer les branches comme le montre l’exemple ci-dessous.
3.3.4 Branches et lien avec master
La branche master
est la branche principale. Elle se doit d’être “propre.”
On ne pousse pas des travaux non aboutis sur master
, c’est assez mal vu et sources de futurs problèmes.
Peut-on pousser directement sur master
? Oui, pour des petites corrections, des modifications mineures dont vous êtes certains qu’elles vont fonctionner. Mais sachez que dans le cadre de projets sensibles, c’est strictement interdit. Il y a justement des meilleurs outils pour proposer des changements substantiels. Dans votre organisation, n’ayez pas peur de fixer comme règle l’interdiction de pousser sur master
(cf. section précédente), cela obligera l’équipe
projet à travailler avec rigueur.
Au moindre doute, créez une branche ! Les branches sont utilisées pour des travaux significatifs :
- vous travaillez seul sur une tâche qui va vous prendre plusieurs heures ou jours de travail (vous ne devez pas pousser sur
master
des travaux non aboutis); - vous travaillez sur une fonctionnalité nouvelle et vous souhaiteriez recueillir l’avis de vos collègues avant de modifier
master
; - vous n’êtes pas certain de réussir vos modifications du premier coup et préférez faire des tests en parallèle.
⛔ Les branches ne sont pas personnelles : Toutes les branches sont publiées, le rebase est interdit. Le push force est également interdit.
⛔ Tous les merges dans master
doivent se faire par l’intermédiaire d’une merge request dans GitLab
. En effet, il est très mal vu de merger une branche dans master localement.
Comment nommer les branches ? Là encore, il y a énormément de conventions différentes. Une fréquemment observée est :
- pour les nouvelles fonctionnalités :
feature/nouvelle-fonctionnalite
oùnouvelle-fontionnalite
est un nom court résumant la fonctionnalité - pour les corrections de bug :
issue-num
oùnum
est le numéro de l’issue - pour les branches liées à une issue:
num-blabla
oùnum
est le numéro de l’issue etblabla
un titre permettant de comprendre l’objet de la merge request.
N’hésitez pas à aller encore plus loin dans la normalisation !
Jusqu’à présent, vous ne travailliez pas simultanément sur un fichier. Les conflits
étaient donc limités. A partir de maintenant, vous allez découvrir l’une des
forces de Git
: on peut travailler sur le même fichier en même temps.
Exercice 2 : Cadavre exquis
Question a. Création d’une branche locale
Placez-vous sur la branche master
dans votre dépôt local.
Créez une branche dans le dépôt local, en lui donnant un nom comportant votre prénom.
Question b. Modification au sein d’une branche
Ouvrez (ou créez) le fichier cadavre_exquis.md
dans le dépôt local, et ajoutez-y deux phrases sans aucune ponctuation. Sauvegardez cette modification en faisant un commit
. N’oubliez pas de rédiger un message le plus clair possible.
Question c. Publication d’une branche
Poussez votre branche vers le dépôt commun (avec push
).
Question d. Récupération de la branche créée par votre voisin
Récupérez la branche créée par votre voisin (avec pull
).
Question e. Modifier une autre branche
Placez-vous sur la branche créée par votre voisin. Ouvrez le fichier cadavre_exquis.md
figurant dans votre dépôt local. Vous devez normalement voir les deux phrases écrites par votre voisin. Ajoutez la ponctuation à ces deux phrases. Sauvegardez cette modification en faisant un commit
. N’oubliez pas de rédiger un message le plus clair possible. Publiez cette modification sur le dépôt distant (avec push
).
Question f. Récupération des corrections de l’autre personne du binôme
Placez-vous sur la branche que vous avez créée à la question a
. Récupérer les modifications apportées à cette branche (avec pull
). Ouvrez le fichier cadavre_exquis.md
. Vous devez normalement constater que les deux phrases que vous avez écrites ont maintenant une ponctuation correcte.
3.3.5 Quelques compléments de GIT
L’outil GIT
permet un grand nombre de fonctionnalités avancées. Les manipulations les plus complexes ne peuvent être effectuées qu’en ligne de commande, mode de fonctionnement privilégié des développeurs avancés. Mais pour les statisticiens, il est possible d’effectuer des commandes avancées de façon intégrée à RStudio.
Une des commandes les plus utiles pour un travail collaboratif pour les statisticiens permet de ne pas partager les bases de données ou tout type de fichier, soit trop volumineux, soit confidentiel :
git ignore
: modifier le fichier permet de conserver des fichiers en privé, c’est-à-dire qu’ils n’apparaissent pas dans le dossier partagé.
Ainsi, il est crucial de ne pas partager les données et exclure les fichiers de la forme *.csv
ainsi que tous les fichiers de sortie, notamment au format *.html
ou *.pdf
. Les fichiers à exclure du contrôle de version sont listées dans un fichier nommé .gitignore
( exemple ici). Il est normalement créé par défaut dans le répertoire du dépôt. Il suffit alors de le modifier en ajoutant à la ligne les fichiers que l’on souhaite ignorer, par exemple “mon_graphique.pdf” ou alors tous les fichiers au format xls en ajoutant “*.xls”.
Si le dossier de travail ne comporte pas ce fichier et que vous désirez exclure un type de fichier, par exemple csv
, pour le créer et y ajouter les fichiers *.csv
par exemple, vous pouvez utiliser le package usethis
avec lequel vous deviendrez familier dans la Partie Package :
# Taper dans la console RStudio
::use_git_ignore("*.csv") usethis
On ne met sous contrôle de version avec git que les fichiers de programmes, semblables à des fichiers texte ( .Sas
, .R
). Il est important d’exclure les fichiers volumineux (données ou résultats) et bien sûr, les fichiers confidentiels.
En particulier, il ne faut pas mettre sous contrôle de version, c’est-à-dire qu’il faut inclure dans le fichier .gitignore
:
- les données (
.csv
,.xlsx
,.sas7bdat
,.Rdata
, etc.) - les fichiers produits grâce au code source (
.pdf
,.html
,.odt
,.docx
,.xlsx
, etc.)
En particulier, il faut être extrêmement vigilant à ne jamais mettre sous contrôle de version des mots de passe ou des jetons d’accès à des API.
La CNIL fournit des conseils aux développeurs pour compléter ces bonnes pratiques (lien).
Le site gitignore.io fournit des modèles de fichiers .gitignore
selon le langage utilisé. Ils peuvent servir de base à enrichir en fonction des besoins.
L’un des avantages de Git
est qu’on peut toujours revenir en arrière. Ce
filet de sécurité permet d’oser des expérimentations, y compris au sein
d’une branche. Il faut être prêt à aller dans la ligne de commande pour cela
mais l’exercice suivant permettra de dédramatiser ceci.
Exercice 3 : J’ai supprimé un fichier par erreur ? Ouf, j’utilise Git !
Maintenant, on va montrer que Git
vous évitera une crise de panique
si vous supprimez un fichier sans faire exprès.
- Dans votre branche, ajouter deux fichiers
fichier_important.md
etbrouillon.md
contenant chacun une phrase. Faire uncommit
de ce fichier. Pusher. - Revenir sur
master
. Regardez l’arborescence des fichiers (dans RStudio ou via Windows) : le fichiermodification_importante.md
n’est plus là: cela vous inquiète-t-il ? - Retournez sur votre branche. Vous allez faire une bêtise et supprimer les deux fichiers à la fois :
- Avec une organisation sans
Git
, vous pouvez maintenant paniquer. - Grâce à
Git
, vous pouvez rester serein. En effet, vous pouvez retourner en arrière.
- Ouvrir le menu
commit
deRStudio
et faitesDiscard All
(fonctionne également avecRevert
) et répondez oui à la boîte de dialogue qui s’ouvre (après l’avoir lue et comprise). Et vous retrouvez vos deux fichiers.
Maintenant, une manipulation plus avancée mais qui permet de rassurer :
- Supprimez à nouveau les deux fichiers. Cependant, cette fois vous faites un
commit
(nommer le commit “je suis étourdi”) et unpush
. - Vous allez sur la branche de votre camarade et vous rendez compte que le fichier
fichier_important.md
a disparu. Vous allez essayer de le rétablir. - Pour cela, aller dans l’historique des commits et identifier le
SHA
du commit responsable. Taper
git checkout <commit hash> -- fichier_important.md
D’autres fonctionnalités plus avancées existent et pourront être mises à profit si elles sont correctement utilisées:
git tag
: sauvegarder une version figée, comme une “photographie” à un instant donnégit log
: filtrer les contenus des différences pour rechercher le commit à l’origine d’un changement en particulier.git blame
: lister les modifications d’un fichier donné à une ligne donnée
Le git blame
est très pratique car il permet de filtrer sur les différences précédentes afin de régler des problèmes ou trouver un commit particulier à l’origine d’un bug ou d’une erreur. Il est facilement accessible sur gitlab.com
en cliquant sur les fichiers (files) du dépôt (repository), en haut à droite pour chaque fichier de programme (cf. infra).
D’autres commandes plus périlleuses peuvent permettre un retour en arrière dans l’historique, appelé rebasage. La réécriture de l’historique est un usage non recommandé pour une utilisation non approfondie comme un projet statistique en équipe. Si vous souhaitiez toutefois vous écarter des sentiers battus et tester ces commandes (telles que git rebase
2 ou git push --force
), appliquez le conseil de survie suivant avant toute manipulation : effectuez une sauvegarde manuelle de votre repository, par l’intermédiaire d’un copié-collé dans un autre dossier de votre ordinateur. Sans cela, vous risqueriez d’endommager votre repository et de perdre définitivement des informations.
Pour aller plus loin, des ressources internes au SSP existent (plutôt destinées à des développeurs) :
GIT
au quotidien par Romain Warnan
- des supports du SNDI sur les bases de
GIT
- la documentation AUSV3 sur quelques manipulations courantes avec
GIT
- utiliser
GIT
avec RStudio par utilitR
Les ressources externes très complètes sont disponibles, citons notamment un livre en français accessible en ligne et la documentation en ligne de GIT
.
3.4 GitLab
, aperçu de la plateforme de partage de code
GitLab
est une plateforme facilitant l’utilisation de Git
, qui permet de travailler de façon collaborative dans le développement informatique, par équipe ou non, pour un code qui évolue constamment. Elle comporte une dimension de réseau social du code qui permet de suivre un projet et y participer. Les utilisateurs ont par exemple un profil qui rassemble leurs différents projets.
Un projet sous GitLab se présente de la manière suivante:
Le fichier README.md
s’affiche automatiquement et il est mis en forme par défaut. Il présente des informations utiles pour la compréhension de l’objectif du projet, son installation, etc. On peut naviguer dans l’arborescence d’un dépôt facilement mais certains types de fichiers s’affichent mal (ex: html
car ils n’ont pas vocation à être partagés).
Les principales fonctionnalités sont présentes dans les onglets d’un projet sous GitLab:
Repository
: le dépôt, c’est le centre du contrôle de versionIssues
: espace de discussion, de suggestions ou demandes.Merge Requests
: suggestion de modifications en proposant au(x) gestionnaire(s) du dépôt de fusionner des branchesCI/CD
: espace dédié à l’intégration continue (cf. Section avancée ** sur le sujet)Wiki
: espace de documentation collaboratif séparé des fichiers du dépôt (exemple). Cela implique que la documentation n’est pas associée à un fichier du dépôt. Il s’agit également d’un dépôt git.Snippets
: morceaux de code à conserver qui peuvent être utiles dans le futur.
Ce sont sur les trois premiers points que reposent l’immense majorité des fonctionnalités.
3.4.1 Repository
Le dépôt regroupe les principales fonctionnalités reliées au contrôle de version. Il indique les fichiers du projet et liste les commits par ordre chronologique. Le navigateur de fichier permet même de modifier /commiter directement en ligne. Pour un fichier donné, il permet d’afficher l’historique des modifications (en haut à droite). Il permet également de visualiser les branches et leur trajectoire et de les comparer entre elles avant de proposer une merge request
(cf. ci-après).
3.4.2 Issues
C’est l’espace de discussion du projet. Un exemple sur le GitHub
InseeFrLab. Par l’intermédiaire de différents sujets ou tickets, cet espace permet de :
- signaler des bugs (à la manière d’un ticket)
- discuter des évolutions d’un projet et proposer des changements
- évoquer des pistes de modifications qui sont à creuser
Ces échanges prennent la forme d’un forum où les sujets sont regroupés sous la forme d’issues (problèmes) qui peuvent être identifiées grâce à des labels. Un des avantages est de pouvoir intégrer des passages de code ou de faire des références croisées entre les issues.
Pour ouvrir une nouvelle issue, par exemple pour discuter d’une modification avant de la proposer ou signaler un problème qu’on ne résoud pas immédiatement, on clique en haut à droite sur le bouton dédié :
Il ne faut pas hésiter à ouvrir des issues
pour prévoir des modifications dans le futur, signaler des points à régler ou à avancer. C’est un outil efficace pour se répartir le travail et cela évite de nombreux échanges mail, avec l’avantage d’être archivé et visible par tous les contributeurs au projet (même ceux qui ne sont pas encore arrivés).
Un aspect très pratique est qu’il est possible de faire référence aux issues dans les messages de commit
en utilisant le numéro de l’issue précédé du signe #
, par exemple #12
. Dans ce cas, automatiquement, GitLab
affichera une référence au commit
dans la page de l’issue (et le lien url cliquable associé ! ).
Il est possible de fermer automatiquement une issue en faisant précéder l’appel d’une issue par le terme Closes
. Cela peut être fait dans un message de commit ou dans la description d’une merge request. Par exemple,
Le problème des données manquantes est réglé
Closes #12
fermera automatiquement l’issue 12 sur la page sur gitlab.com
du projet.
Il existe une astuce bien pratique pour automatiquement fermer une issue
quand on travaille avec une branche. Si comme nom de branche, on donne xx-blabla
où xx
est le numéro de l’issue, alors au moment de la création de la merge request, le commentaire sera automatiquement alimenté par Closes #xx
. Lorsque cette merge request sera validée, #xx
sera automatiquement fermée.
Enfin, il est possible d’avoir un affichage en tableau en cliquant à gauche sur Boards
ou encore d’associer des issues à des milestones
(jalons) qui sont des étapes permettant de suivre l’évolution d’un projet.
3.4.3 Exercice 4 : Ouvrir et organiser les issues
Au début d’une tâche particulière ou d’un projet, il est recommandé d’ouvrir des issues. Prenant la forme d’un espace de discussion, elles correpondront à la fin à des nouvelles fonctionnalités (en anglais, features). Les issues permettent également de signaler des bugs constatés, de se les répartir et d’indiquer s’ils sont réglés ou s’ils ont avancés.
Ces issues seront fermées au fur et à mesure que les fonctionnalités seront implémentées ou bien que vous aurez abandonné vos idées. Des labels peuvent être utilisés pour classer les issues. Il est possible de les affecter à une personne en particulier, fixer une date de rendu, etc.
Tout se passe sur la page du projet GitLab
(menu déroulant à gauche) :
Exercice 2 : Premiers pas sur Gitlab
Question a. Ouverture et attribution
Ouvrir une issue concernant le fichier de votre voisin et indiquant qu’il faut corriger les majuscules et la ponctuation. Lui attribuer l’issue via @idep
.
Question b. Règlement
Corriger votre fichier votre-idep.md
par un commit
puis un push
.
Question c. Clôture
Vérifier via un pull
que votre voisin a corrigé son texte et clôturer l’issue sur GitLab
.
3.4.4 Merge requests (MR)
C’est l’espace pour gérer des fusions de branches, c’est-à-dire le fait de transmettre à la branche commune des modifications en les validant. Cela peut venir à la suite :
- d’une ou plusieurs issues qui ont été créées et discutées
- d’une création de branche afin de propose de l’intégrer
GitLab
facilite énormément le travail de fusion de branches (MR). Si les modifications proposées sont faites avec méthode, cela évite le passage fastidieux par la ligne de commande. Pour créer une nouvelle merge request, on clique en haut à droite sur New Merge request
. On sélectionne ensuite la branche source
(celle où on a fait les modifications) et la branche target
(celle qu’on veut modifier)
On clique sur Compare branches and continue
pour arriver sur la page permettant de décrire la merge request
. On aide le(s) gestionnaire(s) du projet en faisant en sorte d’être explicite sur l’objectif de la merge request
. On peut notamment faire référence à des issues comme #19
dans l’exemple ci-dessous. On donne un titre explicite à la merge request en ajoutant le préfixe WIP:
si celle-ci n’est pas encore finalisée (permet de mentionner précocément au gestionnaire qu’on avance sur le développement d’une branche)
Une bonne pratique est de proposer les options suivantes:
Delete source branch when merge request is accepted
: effacer la branche sur le dépôt commun pour éviter que quelqu’un l’édite alors qu’elle n’est plus d’actualité.Squash commits when merge request is accepted
: Regrouper tous lescommits
(potentiellement très nombreux dans l’ancienne branche) en un seul dans la branche de destination. Cela évite, sur les gros projets, des branches avec des milliers de commits. Pour les petites modifications, c’est-à-dire les branches avec peu decommits
, on peut éviter cette option et laisser l’historique dans la branche fusionnée.
Vous pouvez voir, en dessous, les changements induits si la MR est acceptée. Lorsque la MR
est soumise, GitLab
inspecte les conflits entre les fichiers. S’il n’y a pas de conflit, la MR
peut être acceptée directement depuis GitLab
en cliquant sur le bouton vert Merge
:
En cas de conflit, GitLab
refuse le merge
automatique et propose des commandes:
Il y a deux philosophies dans le domaine:
- C’est à la personne qui propose la
merge request
de proposer une copie propre - C’est au(x) gestionnaire(s) de nettoyer et harmoniser
Les gros projets open-source fonctionnent plutôt de la première manière. Il s’agit de la pratique la plus prudente.
Dans des cas rares, vous vous devez passer par la ligne de commande pour des MR. Suivez précisément les indications du merge locally
et n’oubliez surtout pas l’option --no-ff
lors de l’étape de merge
sans quoi vous réécrirez l’historique ce qui peut endommager votre dépôt.
La logique générale pour les étapes de merge locally
est la suivante :
1. On met à jour la branche locale cible origin
(possible aussi via les menus RStudio
en faisant un pull
) puis on passe sur la branche source (là où sont les changements qu’on veut transmettre).
2. On sélectionne à la main les modifications dans les programmes par l’intermédiaire des HEAD
qui sont apparus dans les codes.
3. On applique les lignes de commande de l’étape 3 (en ligne de commande avec précaution).
4. On transmet au dépôt partager avec un push
(possible via les menus RStudio
).
Le rôle de gestionnaire des merge request
dans un projet collaboratif est important. Il faut absolument bannir les usages de push force
qui peuvent déstabiliser les copies locales des collaborateurs. S’il est nécessaire de faire un push force
, c’est qu’il y a un problème dans la branche, à identifier et régler sans faire push force
3.4.5 Exercice 4 : Fusionner les travaux avec des Merge Requests
Les merge requests
(MR) sont sans doute la fonctionnalité la plus pratique. En ouvrant une MR, il est crucial de :
- donner un titre explicite (comme on donne un objet à un mail);
- donner des détails dans le message (comme pour les
commit
).
Le cas échéant, il est très pratique d’ajouter dans le corps du message close #xx
où xx
est le numéro de l’issue décrivant la fonctionnalité que la MR
implémente. Lorsque la MR
sera fusionnée, l’issue sera automatiquement fermée et un lien sera créé entre l’issue et la MR
. Cela vous permettra de comprendre, plusieurs mois ou années plus tard, comment et pourquoi telle ou telle fonctionnalité a été implémentée.
Une fois une MR
ouverte, il est précieux de solliciter une relecture. En effet, personne (même les meilleurs!) n’est à l’abri d’une erreur.
Les merge requests sont des espaces de discussion. Vous pouvez commenter une proposition de modification en particulier ou bien suggérer une modification.
Lorsqu’elles sont acceptées, les suggestions sont appliquées au moyen d’un commit. Cela permet une parfaite traçabilité des modifications.
Exercice 4 : Merge Request
Question a. Ouvrir une MR
Créez une merge request
dans GitLab. Dans cette merge request
, vous devez proposer d’ajouter à la branche master
du dépôt commun les modifications qui ont été développées dans la branche que vous avez créée au cours de l’exercice 2. Autrement dit, vous proposez d’ajouter au fichier cadavre_exquis.md
les deux phrases que vous avez écrites dans votre branche, et que votre voisin a corrigées.
Question b. Contribuer à une MR
Dans GitLab, allez dans la merge request
créée par votre voisin, et contribuez à la discussion par un message donnant votre avis sur les modifications proposées.
N’acceptez pas les MR, c’est l’objet du prochain exercice
Usuellement, c’est la seule responsabilité spécifique des mainteneurs :
seuls eux peuvent fusionner dans master
. Il leur appartient de veiller à la
bonne qualité des merge requests
.
Gitlab propose deux options lors du merge :
* Delete source branch when merge request is accepted
: supprimer la branche. C’est fortement recommandé car cela évite qu’un contributeur reprenne, après plusieurs mois d’inactivité d’une branche, qui aurait accumulé du retard par rapport à master
, une branche.
* Squash commits when merge request is accepted
: Là, vous devrez faire preuve de discernement. L’habitude est de faire des squash and merge
(pratique la plus largement répandue). Cependant, il peut y avoir des cas où vous préférerez conserver l’historique des commits (c’est plus rare). Très franchement, ce sujet n’est pas le plus important.
3.4.6 Les groupes
Quand un projet est important, on peut créer un groupe qui permet d’avoir une arborescence de dossiers:
3.5 Organiser le travail collaboratif
Les outils de gestion de version permettent des usages multiples afin d’organiser efficacement la collaboration. Cette section propose une synthèse des usages de Git
dans la communauté R
, adaptés à fois à la configuration à l’Insee et au mode de travail des statisticiens.
Cette formation adopte le parti pris de suivre le GitHub Flow
dont une rapide description peut être trouvée sur cette page et qui a pour mérite d’être le plus simple.
En effet, des habitudes se sont imposées peu à peu dans la
communauté R, essentiellement au travers des collaborations sur la plateforme
GitHub
(plateforme de gestion de code similaire à GitLab). Ces usages, semblables à des normes sociales, vous permettront d’acquérir une certaine maîtrise de Git
. Ensuite, au fur et à mesure de l’avancée de vos projets, vous pourrez adapter plus finenement ce fonctionnement à vos besoins et exploiter les nombreuses possibilités offertes par le contrôle de version. Cela n’est absolument pas gênant, à partir du moment où vous comprenez ce que vous faites.
Vous devez savoir qu’il y a plusieurs méthodes de travail avec git
(flow, en anglais). Vous pourrez trouvez des dizaines d’articles en ligne et d’ouvrages sur ce sujet dont chacun prétend avoir trouvé la meilleure organisation du travail (Git flow
, GitHub flow
, GitLab flow
…). Ne lisez pas trop ces livres ou articles sinon vous serez perdus (un peu comme avec les magazines destinés aux jeunes parents ou les conseils pour devenir millionnaires).
Voici la marche à suivre lors de la création d’un nouveau projet :
- Vous devez identifier les responsables de la maintenance du projet. Dans
GitLab
, c’est facile, c’est le rôle de Mainteneur (droits d’écriture surmaster
). - Chaque mainteneur a une responsabilité identique et élevée : n’accordez pas les droits de mainteneur sur votre repository à la légère, vous pourriez le regretter.
- C’est au(x) mainteneur(s) du repository de définir les règles d’organisation du travail (ici, ce sera le
GitHub flow
). - Idéalement, ces règles doivent être précisément décrites dans un fichier nommé
CONTRIBUTING.md
placé à la racine du projet. Il permettra à toute personne rejoignant le projet en cours de route de comprendre les différentes modalités de contribution. - Il est essentiel que chaque personne qui contribue au projet se conformer à ces règles.
Git
est un outil puissant et flexible, adaptable à un grand nombre d’organisation du travail.
Dès lors, les problèmes rencontrés ne sont généralement pas liés à Git
mais à une mauvaise définition en amont de l’organisation du travail ou bien
à son non-respect par les mainteneurs.
L’expérience enseigne que si vous n’avez pas réfléchi à l’organisation du travail,
il est à peu près certain que vous rencontrerez des problèmes.
Des difficultés peuvent en particulier apparaître dans une
équipe dont personne n’aurait d’expérience avec Git
. Grâce aux fonctionnalités
de Gitlab
, toutes les contributeurs d’un projet n’ont pas besoin de connaître
Git
. Néanmoins, il est mieux que ceux ayant la responsabilité la plus élevés, à savoir
les droits d’écriture dans master
, aient des connaissances en Git
pour
ne pas mettre en péril un projet par une manipulation hasardeuse
(ça n’arrive pas souvent et il y a des filets de sécurité avant de le faire).
Pour les modifications quotidiennes,
il est possible d’effectuer un commit
sur master
.
Cela est possible si dans l’organisation du travail, vous avez les droits
de type Mainteneur. Le premier exercice Git
en local en
donne un exemple. Cependant, pour des changements plus profonds ou
avec des collaborateurs moins réguliers, il est recommandé d’organiser le
travail selon les cinq étapes suivantes.
3.5.1 Créer une branche
Une branche permet de développer “dans son coin” (seul ou à plusieurs) et d’expérimenter des modifications et des améliorations avant de les proposer au dépôt commun.
3.5.2 Modifier et valider ces changements
C’est l’étape des commits
. Le travail se fait sur la branche en veillant à bien commenter les modifications et à bien les distinguer (il vaut mieux trop de commit
que pas assez).
3.5.3 Ouvrir une demande de fusion
Une fois la série de modifications terminée ou le temps venu de rassembler les différents travaux, c’est par l’intermédiaire de la fusion entre la branche et le master
(Pull Request
sur GitHub
ou Merge Request
sur GitLab
). Il faut alors “demander” de fusionner et c’est très bien intégré dans l’environnement GitLab
(cf. ci-après). Cela initie un échange sur les modifications apportées.
3.5.4 Échanger entre collaborateurs et vérifier le code
Une fois la Merge Request
ouverte, il est possible d’échanger des images, de commenter, de poser des questions et d’y répondre. Il est par exemple possible de mentionner un membre de l’équipe par l’intermédiaire de @personne
.
3.5.5 Fusionner la branche avec master
Une fois les vérifications faites, la fusion conserve l’historique des modifications et l’ensemble des commits
.
3.5.6 Exercice 5 : Résoudre les conflits, c’est facile.
Si vous adoptez les règles précédentes, master
sera surtout modifié via des merge requests
. Vous ne devriez donc jamais avoir de conflits sur master.
Tous les conflits devraient donc survenir dans les branches. Les merge requests
en conflit sont impossibles à merger. Il n’y a donc pas de possibilité de commettre un erreur par mégarde (c’est la raison pour laquelle il est interdit de merger dans master localement).
Si votre branche est en conflit, le conflit doit être résolu dans la branche et pas dans master. Voici la marche à suivre :
- appliquez le conseil de survie : faites une copie de sauvegarde de votre clone (avec l’expérience, vous pourrez vous passer de cette étape)
- dans votre clone, placez vous sur la branche en question
git checkout nom-de-la-branche
- mergez master dans la branche
git merge master
- résolvez les conflits
- finalisez le commit de merge
- poussez vers GitLab
Rappel : Il est interdit de faire l’inverse (merger localement la branche dans master)
Exercice 5 : Gérer des conflits dans une branche
Question a. Revenez sur la branche master
. Vous êtes subitement atteint
d’une double personnalité 😵
et oubliez que vous avez déjà proposé des changements.
Vous ouvrez une branche. Refaire l’exercice 3
(questions a
à d
) avec une branche nommée nom-prenom-double
et ouvrir une
merge request.
Question b. Vous revenez tous deux à votre état normal. Sur Gitlab
, une première personne
valide sa merge request
Question c. En local, vous faites tous deux un pull
pour récupérer la modification
du dépôt:
- La personne qui n’a pas fait le
merge
de sa branche se place sur sa branche. Elle doit mettre à jour sa branche pour tenir compte des modifications demaster
:- Il faut taper dans l’invite de commande
git merge master
- Un conflit doit apparaître: il se résout en éditant directement le fichier. Ne pas supprimer la phrase de votre camarade mais accoler votre texte à celle-ci
- Il faut taper dans l’invite de commande
- La personne qui a fait le
merge
retombe dans sa deuxième personnalité et se place dans sa branche*-double
. Elle doit mettre à jour sa branche*-double
pour tenir compte des modifications demaster
:- Il faut taper dans l’invite de commande
git merge master
- Un conflit doit apparaître: il se résout en éditant directement le fichier. Ne pas supprimer la phrase de votre première personnalité mais accoler votre nouveau texte à celle-ci
- Il faut taper dans l’invite de commande
Question d. Sur Gitlab, valider la merge request de la personne qui n’a pas eu de MR validée jusqu’à présent.
Regarder dans l’interface Gitlab, le fichier cadavre_exquis.md
Question e. Retour dans la deuxième personnalité aussi pour la deuxième personne. Chacun sur sa branche -double
, suivre
la procédure de nettoyage du conflit pour être raccord avec master
. La personne la plus rapide à régler le conflit valide sa
merge request, la suivante devra à nouveau harmoniser sa version avec master
3.5.7 Exercice 6 : Contribuer à un dépôt sans droits sur master
À l’issue de cet exercice, vous devriez avoir un premier cadavre exquis. Pour garder trace de ces monuments de littérature, vous allez les
soumettre au dépôt d’exemple. Il est tout à fait possible de soumettre des modifications à un dépôt sur lequel on n’a pas le droit d’écriture
par l’intermédiaire d’un fork
:
- Se trouver un nom de groupe qui va servir à nommer le fichier.
L’une des personnes du groupe crée une branche
finalisation
. Elle se place dessus et change le nom ducadavre-exquis.md
. Par exemple, si vous avez décidé d’être l’équipe Oulipo, nommer le fichieroulipo.md
- Ne pas oublier de faire add, commit, push
- Dans le dépôt d’exemple, ouvrir une
merge request
en mettant votre dépôt et la branchefinalisation
dans la partieSource branch
. Remplir la merge request
Faire une merge request via la branche master
d’un fork
est très mal vu. En effet,
il faut souvent faire des contorsionnements pour réussir à faire coïncider deux histoires
qui n’ont pas de raison de coïncider.
L’aide officielle de GitHub
recommande de faire un rebase
: souvenez-vous, on vous a dit que c’était mal de faire ça ! On s’évite beaucoup
de peine (et on évite une grosse galère au mainteneur du dépôt forké) en évitant simplement de faire le
merge depuis son propre master
. L’astuce de le faire depuis une branche différente fonctionne très bien.
Plus précisément, chaque modification est identifiée de manière unique par un code
SHA
auquel est associé l’auteur, l’horodatage et des méta-données (par exemple le message descriptif associé)↩︎Le rebase est un type particulier de
merge
qui réécrit l’histoire d’une branche (plus de détails). C’est donc une pratique dangereuse car elle risque de rendre obsolète les branches de vos collaborateurs sur lesquelles ils ont potentiellement déjà travaillr.↩︎