Introduction à git


Les systèmes de gestion de version

Les systèmes de gestion de version (Version Control System ou VCS en anglais) permettent de suivre et contrôler les différentes versions du code source d'un projet. Ils peuvent également servir au suivi d'une documentation ou d'un site web. Dans le cadre d'un travail en collaboration, ils permettent de faciliter les échanges et de tracer les contributions de chacun ainsi que de résoudre les conflits.

Git, SVN...

Il existe plusieurs systèmes de gestion de versions dont notamment SVN qui a été très populaire et toujours très utilisé et git (prononcez "guite") ou encore Mercurial. Dans ce cours, on s'interessera en particulier à git qui a l'avantage d'être un système décentralisé où chaque utilisateur travaille dans un environnement isolé.

Pourquoi les utiliser ?

Pour illustrer, voici le contenu d'un de mes répertoires... Il s'agissait d'un rapport écrit par moi-même et corrigé par deux autres personnes. Quelle est donc la dernière version du document ? RapportSoutenances18mois.pdf ? RapportSoutenances18moisV3_final.odt ? RapportSoutenances18moisV3_0905_final.odt ? Qui a corrigé quoi ? Bon courage :|


							RapportSoutenances18moisV3_0905_final.odt
							RapportSoutenances18moisV3_0905_corr2.odt
							RapportSoutenances18moisV3_0905.odt
							RapportSoutenances18moisV3_final.odt
							RapportSoutenances18moisV3_corr.docx
							RapportSoutenances18moisV2_final.odt
							RapportSoutenances18moisV2_corr.odt
							RapportSoutenances18mois.pdf
							RapportSoutenances18mois.odt
						

J'avoue avoir légèrement exagéré l'état de ce répertoire mais vous aurez compris : nous ne sommes pas très doués pour organiser différentes versions d'un fichier, garder trace de leurs modifications, encore plus par différentes personnes. Un système automatisé sera bien plus rigoureux. Les systèmes de gestion de version comme git vont nous permettre :

  • De sauvegarder les fichiers sur un serveur distant.
  • De conserver l'historique des modifications (qui a corrigé quoi dans mon exemple).
  • De pouvoir retravailler sur une ancienne version du fichier que je n'aurai pas forcément conservée.
  • De fusionner les versions de différentes personnes et de résoudre les conflits qui en découleraient (si le correcteur A et B ont voulu corriger la même ligne de mon rapport, que faire ?).
  • Et de visualiser ces changements.

git sera donc particulièrement utile pour gérer le développement d'un projet. C'est pour ça même qu'il a été créé. git a été écrit par Linus Torvalds (le créateur du noyau Linux) en 2005. Aucun des systèmes existants ne satisfaisait les besoins d'un projet comme le développement du noyau Linux : un système décentralisé, rapide, et robuste dans les opérations de fusionnement. Comme vous voyez avec mon exemple, ce sera également utile plus généralement pour toute activité collaborative comme l'écriture d'une documentation.

Mode de fonctionnement général

Je le mentionnais : git est un système décentralisé. Cela signifie qu'il s'appuie sur un dépôt distant mais aussi sur un dépôt local. L'utilisateur travaille sur son dépôt local, sur sa machine (et peut donc travailler déconnecté du réseau) et synchronisera ses modifications avec le dépôt distant.

Prenons l'exemple d'un seul fichier HTML sur ce schéma :

  1. Lorsqu'on commence à travailler, le fichier se trouve sur le dépôt distant, on le rapatrie donc sur notre dépôt local.
  2. On récupère ensuite le fichier depuis notre dépôt local.
  3. Le fichier se trouve dans un répertoire sur notre machine, on peut travailler dessus depuis un éditeur comme d'habitude.
  4. Une fois qu'une modification importante a été faite au fichier, on décide de valider ces changements. On valide donc le fichier sur notre dépôt local.
  5. On peut enfin synchroniser cette version avec le dépôt distant. Toutes les autres personnes participant au projet auront donc accès à ces modifications et pourront récupérer cette nouvelle version dans leur propre dépôt local.
Principe général de git

Pour effectuer ces opérations et avoir un dépôt local sur sa machine, il faut y installer git, c'est l'objet de la prochaine partie. Le dépôt distant lui sera le plus souvent installé sur un serveur. On peut également utiliser le site GitHub dont nous parlerons un tout petit peu plus tard.

Installation de git

Sur Windows

Pour installer git sur Windows, vous avez Git for Windows. Les différentes versions (32/64 bits, versions portables) sont disponibles ici.

Sous OS X

git est livré avec le système depuis 10.9, il suffit que les Command Line Tools soient installés. Pour vérifier que c'est le cas, ouvrez un terminal et saisissez la commande git. Si la commande n'est pas reconnue, vous devez installer les Command Line Tools en saisissant xcode-select --install dans le terminal.

Si vous voulez installer une autre version que celle présente sur le système, c'est ici que ça se passe.

Sous Linux

Selon votre gestionnaire de paquet, lancez sudo apt install git-all (pour Debian, Ubuntu) ou sudo dnf install git-all (Fedora, CentOS).

git est installé sur votre machine, c'est bien mais il vous faut aussi un dépôt distant maintenant. On pourait installer git sur un serveur, vous le verrez souvent en entreprise. On peut aussi utiliser GitHub qui sera tout indiqué pour nous dans le cadre de projets entre étudiants.

Présentation de GitHub

Vous avez sûrement déjà croisé ce site en faisant des recherches ou en installant une application ou un module. GitHub est une plateforme d'hébergement et de suivi de projets basée sur git. Des comptes payants sont disponibles pour un usage professionnel et des comptes gratuits pour les projets de logiciels libres. Un projet hébergé sur GitHub avec un compte gratuit sera donc public ! Il permet donc de mettre en ligne son projet, de le partager avec la communauté et d'utiliser toutes les fonctionnalités de git pour le suivi et l'organisation de votre projet. Il ajoute des fonctionnalités pour le suivi des bugs : les utilisateurs peuvent en signaler, et vous leur répondre.

Présentation de quelques clients graphiques

git s'utilise en ligne de commande dans un terminal comme vous avez pu l'apercevoir en l'installant. L'utilisation en ligne de commande est rapide mais vous pouvez ne pas être à l'aise dans un terminal et il faut se souvenir des commandes à saisir pour gérer le dépôt. La résolution des conflits et la visualisation des différences entre plusieurs versions d'un fichier est aussi bien plus facile avec une interface graphique. Il existe donc plusieurs interfaces graphiques pour utiliser git et s'affranchir de la ligne de commande. On peut citer :

  • Sublime Merge, par les éditeurs de Sublime Text, tout frais puisque sorti en septembre 2018 (multi-plateforme, payant, version d'essai illimitée)
  • GitKraken (multi-plateforme, gratuit)
  • Tower (Windows, OS X, payant)
  • GitHub Desktop (Windows, si votre dépôt distant est sur GitHub, open source)
  • Sourcetree (Windows, OS X, gratuit)

Utilisation de git

Nous allons voir maintenant comment utiliser les fonctionnalités de git : créer un nouveau projet, cloner un projet existant, ajouter de nouveaux fichiers au projet, valider des modifications, récupérer les dernières versions d'un projet et utiliser les branches. En guise d'exemple, je vais mettre le cours sur GitHub et vous pourrez suivre les étapes.

Démarrer un nouveau projet

Le projet est créé et pour le moment il est vide. Je vais donc écrire les deux fichiers LICENCE.md et README.md pour lancer le projet.

Ajouter de nouveaux fichiers ou apporter des modifications

Voilà, le projet est en route et d'autres peuvent y contribuer. Il y a encore deux ou trois actions que vous devriez connaître avant de vous lancer.

Récupérer les changements depuis le dépôt distant

Si un collègue ajoute à son tour un nouveau fichier au projet ou corrige le fichier README.md par exemple, il faudra récupérer les modifications depuis le serveur distant. C'est la commande git pull.

Dans Sublime Merge, vous appuyez sur la flèche dirigée vers le bas en haut à droite.

Utiliser les branches

À ce stade, vous savez comment manipuler les fonctionnalités les plus importantes de git. Dans un projet un peu plus complet que mon projet IntroGit à ce stade, vous pourriez vouloir faire cohabiter deux versions du projet. Une version de production d'un logiciel, accessible aux utilisateurs, et une version de développement où vous implémentez de nouvelles fonctionnalités qui ne sont pas encore prête à passer en production. Pour faire cela avec git, on utilise des branches. Chaque branche sera donc la version du même projet. En ligne de commande, pour créer une nouvelle branche, on utilise la commande git branch ⟨nom_branche⟩. Pour fusionner deux branches, on utilise la commande git merge. Dans Sublime Merge, voilà une démonstration :

Les conflits

Lorsqu'on fusionne plusieurs branches, il peut se produire des conflits. Par exemple, Monsieur A crée le fichier toto.txt dans la branche master et monsieur B crée lui un fichier également nommé toto.txt dans la branche test. Les deux fichiers ont cependant un contenu différent. Lorsque Monsieur A voudra fusionner la branche test avec la branche master, il devra résoudre un conflit : quelle version de toto.txt conserver ? Celle de Monsieur A dans master ou celle de Monsieur B dans test ? C'est dans cette situation qu'une interface graphique est particulièrement pratique puisqu'elle va permettre de visualiser les différences entre les deux versions.

Une dernière démonstration dans Sublime Merge. J'ai créé un fichier cc.md dans la branche test. Il contient seulement un lien vers mon profil GitHub https://github.com/ChloeCabot. Dans la branche master, l'utilisateur @UnFantome a lui aussi créé un fichier cc.md mais y a inscrit son propre profil https://github.com/UnFantome. La fusion va donc lever un conflit :