Cours Spé Dev - Git

Vidéo

Gestionnaire de version

Problématique

Voici une liste des problèmes auxquels les développeur sont souvent confrontés quand ils n’utilisent pas de gestionnaire de version :

  • J’avais un code qui marche, j’ai fait des modifications pour tester quelque chose, je n’arrive plus à revenir en arrière, je n’avais pas de sauvegarde d’une version qui marche.
  • Qui a touché mon programme ? Ca fonctionnait avant, et maintenant il y a eu des modifications et je ne sais pas où !
  • Heu… C’est quoi ces nouveaux fichiers et nouvelles fonctions ? Ca sert à quoi ?
  • Modifie pas ce fichier, je suis en train de le modifier et je ne veux pas perdre ce que je suis en train de faire.

Ils existent pleins d’autres situations du même acabit. Avec un système de gestion de version, cela n’arrivera plus jamais !

Définition d’un gestionnaire de version

Un gestionnaire de version est un programme qui permet aux développeurs de conserver un historique des modifications et des versions de tous les fichiers.

Cela permet entre de garder en mémoire chaque modification de chaque fichier qui a eu lieu, pourquoi le fichier a été modifié et par qui.

De plus, le gestionnaire de version est capable d’assembler des modifications de deux personnes travaillant simultanément sur un même fichier afin d’éviter d’écraser le travail des autres.

Pour résumer, cela permet :

  • Travailler à plusieurs sans perdre aucune modification
  • Revenir en arrière si jamais cela ne fonctionne plus
  • Observer l’évolution étape par étape d’un fichier et de voir chaque modification effectuée sur chaque fichier

Présentation du gestionnaire de version GIT

Il existe plusieurs outils permettant de faire de la gestion de version, mais le plus connu, celui qui a écrasé tout le monde, c’est Git.

Git est donc un outil de gestion de version qui permet de garder l’historique de vos modifications sur votre dépôt local ainsi que sur votre dépôt distant.

Il est important de faire la distinction entre ces deux dépôts.

Dépôt local et dépôt distant

Le dépôt local, comme son nom l’indique, c’est l’historique des versions qui est stocké sur votre ordinateur. Vous seul y avez accès.

Le dépôt distant est permet d’avoir un historique délocalisé. C’est à dire que si votre ordinateur tombe en panne, vous avez toujours une sauvegarde de l’historique sur le dépôt distant. De plus, vous pouvez être plusieurs à utiliser le même dépôt distant, ce qui permet de réaliser du travail collaboratif.

Pour une utilisation optimale du git et éviter tout conflit, il faudra veiller à ce que la synchronisation entre le dépôt local et le dépôt distant soit la plus régulière possible.

Les dépôts distants

Il existe plusieurs dépôts distants connu et très utilisé en voici trois que j’ai pu tester pendant ma carrière :

  • GitHub : l’incontournable. Sans doute le préféré d’une majorité de développeurs. C’est un indispensable à mettre sur votre CV. Il est très demandé par les recruteurs, cela permet notamment de voir votre activité en tant que développeur mais aussi scruter la qualité de votre travail. Il agit aussi comme un réseau social de développeur et permet de contribuer à des projets open sources.
  • GitLab : La puissance ! GitLab est sans doute mon dépôt distant préféré tellement il permet de possibilité ! Cependant pour une utilisation optimale, il vaut mieux l’installer sur un serveur personnel, ce qui n’est pas forcément très aisé. 
  • BitBucket : C’est l’outil que j’ai utilisé pendant mes études. Il convient parfaitement pour des projets en petit groupe (de mémoire pas plus de 3 personnes) dans sa version gratuite. Pour les plus gros groupes il faut payer.

La solution que je vous recommande pour le moment est celle de GitHub. C’est le plus facile à utiliser. Vous n’avez pas besoin à votre niveau de tous les outils de GitLab, mais n’hésitez pas à l’essayer si vous en avez l’occasion !

Création de votre compte GitHub et installation de Git sur votre PC

  • Vous pouvez vous créer un compte si ce n’est déjà fait sur le site de GitHub : https://github.com/
  • Pour créer un nouveau dépôt, cliquez sur le + en haut à droite puis sur New repository
  • Pour installer Git sur votre ordinateur, vous pouvez télécharger là : https://git-scm.com/downloads

Utilisation de Git

Etape 0 : Cloner le dépôt distant (git clone)

Pour cloner le dépôt distant, rien de plus simple, il faut utiliser la commande :

git clone <lien vers le dépôt distant>

Git clone
Git clone

Cet étape est à ne faire qu’une seule fois. Cela permet de récupérer l’état de l’historique sur le dépôt distant.

Vous pouvez maintenant travailler sur votre projet.

Etape 2 : Spécifier les fichiers à enregistrer dans l’historique (git add)

Vous avez modifié vos fichiers, vous souhaitez les enregistrer dans l’historique de version. Vous devez donc spécifier quels sont les fichiers qui vont être enregistrés. Pour cela, vous devez faire :

git add <chemin vers le fichier>

Si vous ne vous souvenez plus de ce que vous avez modifié, vous pouvez utiliser la commande suivante :

git status

Git status
Git status

Dernière remarque, si vous souhaitez tenir compte de toutes les modifications, vous pouvez faire git add *.

Etape 3 : Enregistrer l’historique (git commit)

On appelle un commit, un enregistrement à un instant T. Pour ce faire, vous devez utiliser la commande suivante :

git commit -m "<Votre message>"

Git commit
Git commit

Etape 4 : Synchroniser les modifications avec le dépôt distant (git push)

Jusqu’à maintenant, vous travaillez uniquement en local. Il faut envoyer les modifications sur le dépôt distant avec la commande suivante:

git push <repository> <branch>

  • <repository> : C’est le dépôt distant où vous souhaitez déposer vos fichiers. Ici ce sera origin. C’est celui qui est créé lors du git clone. origin est donc le dépôt distant du clone originel du projet.
  • <branch> : Nous y viendrons plus tard, pour le moment, on a qu’une seule branche : master
Git push
Git push

Etape 1 : Synchroniser les modifications avec le dépôt local (git pull)

Les plus attentifs auront remarqué qu’il n’y avait pas d’étape 1. Ce n’était pas un oubli ! Car on était dans le cas où il y avait un clone. Le clone se fait qu’une seule fois. Ensuite, il faut synchroniser votre dépôt local avec le dépôt distant dès que vous commencez à travailler. Comme ça vous êtes sûr de travailler sur la dernière version du projet. Pour se faire, vous devez utiliser :

git pull <repository> <branch>

C’est exactement la même chose qu’à l’étape 4, sauf que là c’est pour distant -> local

Git pull
Git pull

Les conflits

Les conflits surviennent dans la grande majorité des cas suite à un problème de synchronisation entre le dépôt distant et le dépôt local. Plus vous mettez de temps à synchroniser plus votre prenez le risque d’avoir des conflits. D’où la nécessité de synchroniser régulièrement.

Malgré, tout, vous pouvez être confrontés à des problèmes de conflits si vous travailler en même temps sur le même fichier. L’une des personnes va synchroniser son travail, puis lorsque la seconde va synchroniser, il va y avoir un conflit, car les modifications ne concernent pas la dernière version sur le dépôt distant.

Les conflits

Git push rejeté
Git push rejeté

Dans ce cas là, le push a été rejeté. Git est gentil, il dit comment résoudre le problème, et pour cela il faut simplement faire un git pull

Résolution du conflit : La fusions

En faisant un git pull sur un conflit, git va fusionner les fichiers comme il peut. Dans certain cas, il n’y aura pas de souci, dans d’autres, il faudra une intervention de votre part.

Echec de fusion
Echec de fusion

Là, le message d’erreur dit qu’il y a un conflit dans le fichier un_script.py. Il suffit d’ouvrir le fichier et de corriger les modifications…

Résolution du conflit : La fusion

Réparer le fichier
Réparer le fichier

Git a encadré les modifications. Ce qui est entre <<<<<<< HEADet ======= concerne vos modifications locales et l’autre partie, ce sont les modifications distantes.

Pour résoudre le conflit, vous avez juste à retravailler et corriger cette partie. Puis à refaire les étapes 2 à 4 (add -> commit -> push)

Réparer le fichier
Réparer le fichier

Les branches

A quoi ça sert ?

Dans un projet, il arrive souvent que vous souhaitez travailler sur partie du projet qui nécessite un certain nombre de modifications. Cependant cela prend du temps, et vous ne voulez pas casser une version qui marche et qui est utilisée par les autres. Vous ne souhaitez pas non plus que les modifications des autres cassent votre travail en cours.

Pour éviter tout ceci, on utilise des branches. Une branche est une ligne de développement. Cela permet de garder sur la branche principale (master) une version qui marche en tout temps.

Créer une branche

Pour créer une branche, rien de plus simple, il suffit de saisir la commande :

git checkout -b <nom de la branche>

Puis vous pouvez travailler dessus comme d’habitude (add -> commit). Notez: Vous ne pouvez pas créer de branche si des conflits sont en cours de résolution.

Création d’une nouvelle branche
Création d’une nouvelle branche

Synchroniser la branche avec le dépôt distant

Cela marche comme avant, vous avez juste besoin de spécifier la bonne branche à push. C’est à dire qu’à la place de master vous allez mettre le nom de votre branche.

Synchroniser la branche
Synchroniser la branche

Basculer entre les branches

Pour passer de branche en branche comme Tarzan le fait de lianes en lianes, vous avez juste besoin de la commande :

git checkout <nom de la branche>

Fusionner les branches

Vous avez fini votre travail sur votre branche, vous souhaitez désormais l’intégrer à votre branche principale.

Pour cela, vous devez vous placer sur la branche qui va recevoir la fusion. Puis réaliser la fusion en faisant :

git merge <nom de la branche>

Et c’est tout ! Attention la fusion n’a eu lieu qu’en local, il ne faut pas oublier de synchroniser avec le dépôt distant la fusion !

Fusion de branche
Fusion de branche