Colaborer sur du code avec Git

Introduction

Git est un logiciel dit de gestion de version (version control system - VCS) qui permet de suivre les modifications qui sont apportées à un code. L'intérêt principal de ce type d'outil est de permettre à plusieurs développeurs d'éditer un code en parallèle et de se synchroniser régulièrement sans risquer de perdre d'information lors de la mutualisation.
Git en tant que logiciel est dit "décentralisé", c'est à dire qu'il peut être utilisé localement pour des projets personnels sans avoir besoin d'un hébergement accessible depuis internet. Dans le cas d'une utilisation classique à plusieurs, on ajoutera généralement l'utilisation d'un hébergement "centralisé" en ligne sur lequel chaque développeur pourra se synchroniser en venant récupérer les updates, et/ou envoyer ses modifications. Plusieurs plateformes sont à votre disposition pour réaliser cet hébergement:

Process du tutoriel

La suite de ce document décrit un tutoriel "pas à pas" dans le cas où il s'agit de votre toute première utilisation de git et d'une plateforme d'hébergement.
On considèrera la configuration où vous êtes en binome: Student1 et Student2. Le schéma que l'on souhaite mettre en place contient 3 instances de code:
assets/git_schema.png
On suivra la logique de mise en place suivante permettant de vous entrainer à faire une première synchronisation tant en minimisant les étapes de configurations sur vos machines:
Remarques: Git est un logiciel écrit et documenté principalement pour fonctionner à partir d'une ligne de commande, peut importe votre OS.

1) Installation du logiciel git

Il est tout d'abord nécessaire d'installer sur vos machines le logiciel git. Chaque étudiant du groupe doit réaliser cette étape sur sa propre machine.
# ex Sous Ubuntu
sudo apt get install git

Installation de gitforwindows sous Windows

Installez Git que vous pouvez trouver à partir de https://gitforwindows.org/.
Lors de l'installation, suivez les options par défaut sauf pour les écrans suivants:
assets/01_gitforwindows_texteditor.jpg
assets/02_gitforwindows_defaultbranch.jpg
Une fois installé, vous devez pouvoir exécuter le programme "Git Bash" depuis le menu de Windows. Celui-ci vous ouvrez une ligne de commande qui vous permettra de naviguer dans vos répertoires avec une ligne de commande de type Unix.
assets/06_git_bash.jpg

2) Création d'un projet sur gitlab

Dans cette étape, nous allons créer un projet sur le serveur en ligne. Ce sera à partir de ce projet centralisé en ligne que votre groupe pourra se synchroniser.
Dans un premier temps, créez un simple projet vide qui va permettre d'initialiser le projet. Nous complèterons l'ensemble avec les fichiers du projet dans un second temps. Notez que cette étape ne doit être faite qu'une seule fois par projet et par un seul étudiant du groupe. On supposera que seul Student1 réalise cette étape.
L'interface de gitlab devrait disposer d'une option de création d'un nouveau projet.
assets/03_gitlab_interface.jpg
Si plusieurs choix sont proposés, sélectionnez la création d'un projet vide qui ne contiendra pas de fichiers (souvent un simple Readme).
assets/04_gitlab_create_project.jpg
Complétez le nom de votre projet, par exemple inf443-project-nom1-nom2. Vous pouvez choisir à ce moment si votre projet sera public ou privé (peut être modifié par la suite également).
assets/05_gitlab_create_project_fill.jpg
Une fois créé, vous devriez obtenir une fenêtre montrant l'état actuel de votre projet. Dans le cas présenté, le projet ne contient qu'un fichier README.md généré automatiquement dont le contenu est affiché dans l'interface.
assets/05b_gitlab_create_done.jpg
Par défaut, Student1 pourra avoir accès à ce projet à partir de son login/mot de passe. Mais Student2 n'y a pas accès en écriture (ni en lecture si le projet est privé).
Pour permettre la collaboration avec Student2, ajoutez le en tant que membre du projet.
Student2 devrait recevoir une notification sur l'outil en ligne, qu'il devra potentiellement accepter pour obtenir accès au projet.

3) Clone du projet et synchronisation

Récupération du code (git clone)

Dans cette partie, un des étudiants va récupérer le code depuis le dépot, et vérifier qu'il arrive à se synchroniser avec le serveur. On supposera que cette opération est réalisée d'abord par Student1.
Student1 doit réaliser une étape dite de "clone". C'est à dire que l'on va récupérer le code à l'aide de git, ainsi que l'ensemble de la configuration indiquant où est hébergé le code pour pouvoir y apporter des modifications par la suite.
Choisissez tout d'abord un endroit dans vos fichiers où sera placé le code de votre projet.
A) Ouvrez une ligne de commande et déplacez-vous jusqu'à être localement dans le répertoire que vous avez choisi (à l'aide des commandes "cd directoryName").
# Exemple: Si votre répertoire est dans: c:/inf443_project
# Etape 1: Allez sur la racine du répertoire c:
cd /c
# Etape 2: Allez dans inf443_project
cd inf443_project
B) Une fois dans le bon répertoire (vérifiez avec la commande "pwd"), tapez la commande suivante pour réaliser l'étape de "clone"
git clone URL
avec URL correspondant à celle de votre projet sur le serveur en ligne.
assets/07_git_clone.jpg
Vous devrez indiquer votre login et mot de passe à ce moment si le projet est privé avec gitlab.
assets/08_git_password.jpg
Si l'étape s'est déroulée correctement, vous devriez voir votre répertoire.
assets/09_git_clone_done.jpg
Rem. A la différence d'un "téléchargement classique", la récupération du code par le biais d'un git clone permet de récupérer un projet git déjà initialisé avec l'url du projet centralisé.

Envoie sur le serveur (git commit, git push)

Pour l'instant, le répertoire récupéré par Student1 ne contient rien, ou un seul fichier README.md. Nous allons vérifier dans cet étape que Student1 arrive à envoyer ses modifications sur le serveur.
Indiquez à git qu'il faut traquer un nouveau fichier avec les lignes de commande suivante:
git add README.md
git add temp.cpp
Rem. "git add README.md" est inutile si README.md était déjà présent. Git track automatiquement les modifications sur les fichiers du dépot. Le fichier temp.cpp doit par contre être explicitement ajouté à Git car il ne faisait pas partie du dépot.
Dans la suite, la synchronisation avec le dépot central se réalise en deux étapes:

Etape 1: Commit

Le "commit" correspond à la prise en compte par Git d'une nouvelle version locale à votre machine.
git commit -a
Un éditeur de texte (VS Code si vous l'aviez sélectionné) va s'ouvrir en attendant que vous indiquiez le message correspondant à cette mise à jour.
assets/10_git_commit.jpg
assets/11_git_commit_ok.jpg
Rem. Il est possible d'avoir le listing de l'ensemble des commits passés (donc de vos mises à jours) en appelant "git log"
assets/12_git_log.jpg

Etape 2: Push

L'étape de commit n'impacte que le répertoire Git sur votre machine et n'est pas propagé sur le serveur centralisé. Pour cela, vous devez appeler explicitement
git push
assets/13_git_push.jpg
Si l'opération "push" s'est bien déroulée, vous devriez voir sur le dépot en ligne la propagation de votre modification et votre nouveau fichier (rafraichissez le navigateur).
Votre code local et en ligne sont alors synchronisés.

Synchronisation globale

Vérifiez désormais que Student2 puisse réaliser les mêmes étapes. Réalisez dans l'ordre:
Après cette étape, les codes sont dans l'état suivant:
Pour mettre à jour sa version, Student1 doit réaliser un "pull"
git pull
La commande permet de récupérer la dernière version du code et vient intégrer les modifications dans le répertoire local. Une synthèse des fichiers modifiés/ajoutés sont affichés sur la ligne de commande.
assets/14_git_pull.jpg
A ce stade, les trois codes sont tous au même stade.
Si jamais Student1 avait modifié son code avant de réaliser un pull, git indiquerait qu'il faudrait alors préalablement réaliser un "commit": La mise à jour d'un code depuis un dépot en ligne ne pouvant se faire que sur une version "localement à jour".
Si jamais Student1 avait modifié la même fonction que Student2 entre temps, un conflit serait mentionné. Il faudra alors choisir entre:

Git pull/commit/push

Student1 et Student2 peuvent par la suite éditer en parallèle leur propre version de code localement. La synchronisation consiste à régulièrement venir mettre à jour sa version depuis le dépot en ligne, et y envoyer ses propres modifications. Student1 et Student2 peuvent réaliser ces étapes à différents moments.
Il est conseillé de suivre l'enchainement suivant pour chaque mise à jour:
# Mise a jour locale
git commit -a

# Récupération des mises à jour depuis le dépot en ligne
git pull

# Si git pull récupère un nouveau code, il sera nécessaire de faire un nouveau commit
# git commit -a # si nécessaire pour le "merge" de code

# Envoie de ses propres modifications sur le dépot en ligne
git push
Pour éviter les conflits, et les divergences de votre code, prenez l'habitude de mettre régulièrement à jour votre code. Il est conseillé de garder sur le dépot en ligne une version la plus à jour possible, en veillant à ne placer que des modifications qui n'empêchent pas le code de compiler.

Mise en place du projet sur le dépot

Préparation du répertoire du projet

Jusqu'à présent vous avez créé un dépot git contenant uniquement des fichiers de tests. Dans la suite, nous allons nous servir de ce dépot pour y placer les fichiers du projet.
Le principe consiste à ce que l'un des étudiants (uniquement Student1, ou uniquement Student2, mais pas les deux) remplace les fichiers de son dépot git par une version initiale du projet d'où vous allez partir.
Les fichiers que vous devez déposer sur ce répertoire sont l'ensemble des fichiers sources nécessaire à la compilation chez chacun des étudiants. Cela comprend des fichiers de votre scène, mais également l'ensemble de la bibliothèque CGP. Par contre, vous ne devez pas placer sur votre dépot git les fichiers temporaires issus de la compilation (ex. les répertoire build/) puisque ceux-ci n'ont pas à être partagés entre vous et viendrait générer des conflits à chaque mise à jour.
Vous pouvez réaliser cette préparation de fichiers de bases:
Une fois mis en place, votre répertoire git devra avoir cette architecture:
assets/15_project_directory.jpg assets/15b_project_directory.jpg
Remarques:

Envoie sur le dépot en ligne

Pour l'instant le projet n'est placé que sur l'ordinateur de l'un des étudiants. Il faut désormais ajouter les fichiers sur git et les synchroniser.
Remarque: Avant tout ajout de répertoire avec git, prenez soin de vérifier que ces répertoires ne contiennent que les fichiers sources nécessaires et pas de fichiers issus de la compilation.
Ajout des répertoires sur git
git add cgp/
git add scenes_inf443/ 
git add .gitignore # si vous avez ce fichier
git add README.md  # si necessaire
Synchronization et envoi
git commit -a 
# ou git commit -m "Initialization project"

git push
Si tout se passe bien, les fichiers de votre projet devraient être visible sur le dépot en ligne.
Si vous avez des fichiers inutiles (ex. temp.cpp) issus des tests, vous pouvez les supprimer du dépot à l'aide de "git rm fileName"
Exemple:
git rm temp.cpp
git commit -m "Remove temp.cpp from repository"
git push
assets/16_project_online.jpg

Synchronisation

Une fois le nouveau code placé en ligne, le second étudiant peut réaliser un "git pull" et vérifier qu'il arrive bien à récupérer le code.
Vous pouvez alors séparément compiler le code et commencer à éditer votre projet.