Le but de ce tutorial est de lister toutes les commandes nécessaires à :
- la création d'un dépot sur GitHub
- la synchronisation de ce dépot par 2 développeurs (au moins)
- la collaboration au minimum de ces développeurs pour écrire du code
Avant toute création d'un dépot sur GitHub, il est nécessaire que chacun des 2 développeurs créent un compte sur GitHub. Dans la suite de ce tutorial, nous les nommerons dev1 et dev2.
- Le développeur
dev1prend le rôle de "Project leader". Le développeurdev2se met en attente pour l'instant. - Il crée un dépot (i.e "repository", pas un projet) nommé par exemple
itc313-TP1(voir copie ecran ci-dessous)- Le dépot peut être "Public" (c'est-à-dire lisible par tout le monde) ou "Private" (c'est-à-dire accessible uniquement par les développeurs invités).
- Le dépot peut être initialisé avec un fichier Readme dans lequel on donne des informations sur le dépot
- Le dépot peut être créé avec une licence (Ex GPL , Apache, MIT, ...) ou pas.
- Pour l'instant, le .gitignore peut être laissé à "None".
- Une fois le dépot itc313 créé, le développeur
dev1ouvre la page "settings" et invite le développeurdev2sur le dépot choisi. Attention, le développeurdev2va recevoir un mail et devra valider l'invitation pour qu'elle soit effective.
C'est maintenant terminé sur GitHub. Tout le reste peut se passer sur les machines des développeurs dev1 et dev2.
Toutes les opérations se passent dans un terminal.
- Création d'un directory itc3113 :
mkdir itc313 - Clone du dépot distant :
git clone https://dev1@github.com/dev1/itc313-TP1.git(Bien surdev1est à remplacer par le nom du développeur 1 etitc313-TP1par le nom du dépot choisi). Ledev1@indique qu'on se connecte avec le logindev1surgithub.com. Ledev1/itc313-TP1.gitindique qu'on essaie de récupérer le dépotitc313-TP1qui a été créé pardev1. Si le dépot est "Private" alors un mot de passe sera demandé. - Vous pouvez aussi le faire en ssh avec la commande
git clone git@github.com:dev1/itc313-TP1.git. L'intérêt d'utiliser ssh est de pouvoir déposer ses clés ssh publiques sur github et ainsi vous n'aurez plus à saisir de mots de passe (voir https://help.github.com/en/github/authenticating-to-github/adding-a-new-ssh-key-to-your-github-account) - Si tout se passe bien, vous allez récupérer le contenu du dépot (le fichier Readme.md pour l'instant) dans un dossier nommé
itc313-TP1. - Si ce n'est pas le cas, regarder le message d'erreur et recommencer éventuellement les opérations.
- Création d'un directory itc3113 :
mkdir itc313 - Clone du dépot distant :
git clone https://dev2@github.com/dev1/itc313-TP1.git(Bien surdev1etdev2sont à remplacer par le nom des développeurs etitc313-TP1par le nom du dépot choisi). Ledev2@indique qu'on se connecte avec le logindev2surgithub.com. Ledev1/itc313-TP1.gitindique qu'on essaie de récupérer le dépotitc313-TP1qui a été créé pardev1(leProject Leader) et qui est accessible pardev2suite à l'invitation faite. Si le dépot est "Private" alors un mot de passe sera demandé. - Si tout se passe bien, vous allez récupérer le contenu du dépot (le fichier Readme.md pour l'instant) dans un dossier nommé
itc313-TP1. - Si ce n'est pas le cas, regarder le message d'erreur et recommencer éventuellement les opérations.
Chacun des 2 développeurs peut maintenant travailler en toute sérénité sur sa machine. Attention tout de même à bien se répartir le travail afin de minimiser les risques de conflit.
Pour les TPs, une stratégie facile à mettre en oeuvre est de se répartir les questions. Pour le TP1, les premières questions sont indépendantes et peuvent facilement être traitées en parallèles par dev1 et dev2.
Prenons par exemple la répartition suivante :
dev1va traiter la Question 1 sur la classe Datedev2va traiter la Question 2 sur la classe Client
Sur son ordinateur, dev1 va effectuer les opérations suivantes :
- Création d'une branche "Question1" :
git branch Question1 - Bascule sur la branche "Question1" :
git checkout Question1 - Création des fichiers Date.h, Date.cpp, Date-test.cpp
- Pour la compilation, télécharger le Makefile proposé avec le sujet du TP dans le dépot GitHub https://github.com/dginhac/esirem-itc313/)
- Renommer votre
MakefileenMakefile.dateet modifier la ligne 7 en mettantSRCS = Date.cpp Date-test.cppet la ligne 11 en mettantTARGET = Date-test - Pour compiler, utiliser la commande
make -f Makefile.date
Une fois que tout est fonctionnel, vous aller pouvoir passer au commit des fichiers.
Sur son ordinateur, dev2 va effectuer les opérations suivantes :
- Création d'une branche "Question2" :
git branch Question2 - Bascule sur la branche "Question2" :
git checkout Question2 - Création des fichiers Client.h, Client.cpp, Client-test.cpp
- Pour la compilation, télécharger le Makefile proposé avec le sujet du TP dans le dépot GitHub https://github.com/dginhac/esirem-itc313/)
- Renommer votre
MakefileenMakefile.clientet modifier la ligne 7 en mettantSRCS = Client.cpp Client-test.cppet la ligne 11 en mettantTARGET = Client-test - Pour compiler, utiliser la commande
make -f Makefile.client
Une fois que tout est fonctionnel, vous aller pouvoir passer au commit des fichiers. Attention, vous pouvez faire plusieurs commit par Question (typiquement un par sous question.)
git statusva permettre de lister les fichiers non encore suivis et les fichiers modifiés depuis le dernier commit.- Parmi les fichiers, on ne veut versionner que les fichiers
.cpp,.hetMakefile. On ne versionne pas ni les fichiers de dépendances (.d), ni les fichiers objets (.o), ni les fichiers exécutables (Date-test ou Client-Test). - Pour cela, on va creer un fichier
.gitignoreet lui ajouter les lignes suivantes :
*.o
*.d
*-test
- En refaisant un
git status, seuls vont apparaitre les fichiers.h,.cpp,.gitignoreetMakefile git add .va ajouter les fichiersgit commit -m "Question X : Fonctionnalité ok"(Attention a être explicite dans le message mis dans le commit)
Ce processus est réitéré pour chaque développeur pour toutes les sous questions de la classe Date ou Client.
Une fois fait, dev1 a résolu la question 1 dans la branche locale Question1 et dev2 a fait de même dans la branche locale Question2.
Lorsqu'une question est complétement achevée et validée, on peut fusionner la branche Question avec la branche master
git checkout masterpour se repositionner dans la branchemastergit merge Question1pourdev1etgit merge Question2pourdev2- Si tout se passe bien, vous pouvez ensuite détruire la branche devenue inutile avec
git branch -d Question1ougit branch -d Question2. - Si ca se passe mal, le message vous indiquera quel fichier a échoué et vous devrez éditer ce fichier, corriger manuellement la zone de conflit, refaire un
git add ., ungit commit -m "merge manuel de ...
Au final, vous aurez intégré le code développé dans la branche 'Question' dans la branche principale Master.
Une fois qu'une nouvelle fonctionnalité a été intégré dans la branche Master en local, il faut l'envoyer sur le dépot distant GitHub pour que l'autre développeur puisse la récupérer.
Imaginons que dev1 finisse avant dev2.
dev1 va faire :
git branchpour s'assurer d'être sur la branchemaster. Si ce n'est pas le cas, faire ungit checkout masterpour y aller.git push -u origin masterpermet d'envoyer la branche localemastervers la branchemasterdu dépot distant (nomméorigin). L'option-upermet de mémoriser l'association entre branche localemasteret branche distantemaster. Cela permet ensuite de taper uniquement la commandegit push- Normalement tout se passe bien.
dev1a envoyé son code versGitHubet vous pouvez le vérifier sur le site. - Si ce n'est pas le cas, c'est que l'autre développeur a fait un
git pushavant vous. Dans ce cas, se reporter plus bas et faire comme si on étaitdev2.
dev2 va faire :
git branchpour s'assurer d'être sur la branchemaster. Si ce n'est pas le cas, faire ungit checkout masterpour y aller.- Récupérer les commits que
dev1a envoyé surGitHuben faisantgit pull origin master. - Ensuite, faire
git push -u origin masterpour envoyer la branche localemastervers la branchemasterdu dépot distant (nomméorigin). L'option-upermet de mémoriser l'association entre branche localemasteret branche distantemaster. Cela permet ensuite de taper uniquement la commandegit push - Normalement tout se passe bien.
dev2a envoyé son code versGitHubet vous pouvez le vérifier sur le site.
A partir de ce moment là, le dépot GitHub possède tous les commits des 2 développeurs.
dev1 doit faire un dernier git pull pour récupérer les commits de dev2 et avoir une version parfaitement synchronisée.
- Bien se repartir les fonctionnalités entre les développeurs
- Créer une branche par fonctionnalité
- Faire des commits reguliers avec des messages explicites pendant le développement de la fonctionnalité
- Une fois la fonctionnalité validée, fusionner la branche avec
master - Faire un
git pullavant de faire ungit pushpermet de s'assurer de bien avoir la version a jour sur sa machine avant d'essayer de mettre à jour le dépot GitHub.

