PLATEFORME INFORMATIQUE PPTI

Premiers pas avec GIT : système de gestion de versions

Git est un système de gestion de versions partagé qui fut développé en 2005 par le créateur de Linux Linus Thorvalds et publié sous licence libre GNU-GPLv2.

Git est un système de gestion de versions décentralisé. Il existe un dépôt (de l’anglais repository) dans lequel tous les changements sont incorporés et qui permet aux utilisateurs d’y télécharger leurs propres copies de travail.

  • Installer GIT sur son matériel: Vous trouverez les fichiers d’installation pour les différents systèmes sur le site officiel de GIT : https://git-scm.com/downloads
  • Configuration de GIT

Quand GIT est installé sur votre système, il vous reste à renseigner votre nom et votre adresse mail de cette façon :

$ git config --global user.name « votre_nom »
$ git config --global user.email « votre_email »

Après son installation et sa configuration, vous pouvez utiliser GIT pour gérer vos projets.

  • Les fonctionnalités de base de GIT :

Créer et cloner un répertoire GIT

Le répertoire GIT est le répertoire central de tout projet géré et constitue la zone commune à tous les participants permettant de régler l’intégralité du contrôle des versions. Votre première étape dans GIT consistera donc à créer un tel répertoire principal ou à le cloner (sous la forme d’une copie de travail), dans la mesure où vous vous connectez à un projet dont le développement commun est déjà géré à l’aide de GIT.

Si vous venez tout juste d’installer cet outil pour apprendre à utiliser GIT, vous devrez tout d’abord créer un répertoire. Pour ce faire, allez dans le répertoire local désiré sur votre appareil et saisissez la commande suivante pour créer un répertoire .git :

  git init

Si le répertoire Git existe déjà pour votre projet, vous aurez simplement besoin de l’adresse Web ou réseau de ce répertoire pour créer une copie de travail sur votre ordinateur avec la commande « git clone » :

  git clone https://one-test.website/git-repository 

Vérifier le statut  du répertoire

Vous pouvez vérifier l’actualité de votre copie de travail à l’aide de la commande suivante :

  git status

Si le projet ne comporte aucune modification, apparaîtra le message « No commits yet ». Git vous indique aussi que vous n’avez actuellement partagé aucune modification pour le prochain commit (« nothing to commit »).

Ajouter des fichiers à la gestion de versions

Pour ajouter un nouveau fichier à la gestion des versions, utilisez la commande « git add » sur ce fichier (il doit se trouver dans le répertoire de travail).

  git add toto.txt

Une nouvelle vérification du statut du répertoire « git status » indique que le fichier « toto.txt » est présenté comme un candidat potentiel pour la prochaine étape de modification officielle du projet (« Changes to be commited »).

Vous pouvez consulter ce qui va être envoyé via la commande commit avec la commande    « git diff  avec l’option –cached » :

  git diff --cached

Sans l’option –cached la commande « git diff » vous montrera les changements que vous avez fait et qui ne sont pas encore ajoutés à l’index (HEAD).

 

Valider les modifications

Les modifications que vous avez enregistrées pour la gestion des versions  doivent toujours être validées par un commit pour être reprises dans le HEAD. Le HEAD est un type d’index qui renvoie au dernier commit ayant pris effet dans l’environnement de travail Git actuel (également appelé « branche »). Pour cette étape, la commande est la suivante :

   git commit

Pour plusieurs fichiers à envoyer en une seule fois, utiliser la commande suivante :

   git commit -a

Une fois le git commit exécuté vous obtenez un message récapitulatif portant sur le commit : vous trouverez d’une part le nom de la branche (branche du projet ) ainsi que la somme de contrôle SHA 1 du commit.

Obtenir une représentation graphique du résultat, saisir la commande suivante :

   gitk

 

Obtenir l’historique des commits

Git a la possibilité d’afficher n’importe quand les dernières modifications effectuées dans le répertoire. La commande Git est :

   git log

La commande « git log » liste les commits générés par ordre anti chronologique.  S’affichent  la somme de contrôle SHA 1, l’auteur (le nom et l’adresse email) et la date du commit concerné.

La commande « git log » peut être modifiée à l’aide de différents paramètres. Certaines options utiles sont listées dans le tableau ci-dessous :

Option pour :

« git log »

Description

-p

indique également les modifications contenues dans un commit

-2

liste uniquement les derniers commits exécutés

--stat

ajoute à chaque entrée une petite statistique indiquant quels fichiers ont été modifiés et combien de lignes ont été ajoutées ou supprimées

--pretty

modifie le format de la version pour l’un des différents formats disponibles ; --pretty=oneline est par exemple un format possible qui liste tous les commits dans une même ligne

--abbrev-commit

affiche uniquement les premiers caractères d’une somme de contrôle SHA 1

--relative-date

affiche la date d’une modification dans un format relatif (par ex. « il y a deux semaines »)

 

 

Enregistrer des commits dans le répertoire principal

Nous avons vu comment enregistrer les modifications sous forme de commit dans le HEAD du répertoire local. Pour que les modifications soient reprises dans le répertoire principal, il est nécessaire de saisir la commande suivante :

   git push origin master

Avec ce code, Git transmet automatiquement tous les commits créés, qui jusqu’à présent se trouvaient uniquement dans la copie de travail, dans le répertoire principal également appelé « master ». Si vous remplacez ce nom dans le code indiqué par une autre branche (branche de projet), les fichiers sont alors directement envoyés à cet endroit.

Créer, gérer et supprimer des branches

Les branches sont en fait des versions de travail personnelles du répertoire principal, lui-même qualifié de branche portant le nom de « master ». Avec ces branches de travail, Git offre une base idéale pour développer des fonctionnalités de façon isolée et les rassembler uniquement à un moment ultérieur. Cette dernière action est également appelée « fusionner » (en angl. « merge »).

Pour créer une nouvelle branche vous aurez simplement besoin de la commande « git branch » et d’y rattacher le nom de la branche souhaitée. Vous pouvez par exemple créer une branche portant le nom « experimental » de la manière suivante :

   git branch experimental

Vous pouvez ensuite passer à cette branche à tout moment à l’aide de la commande « git switch » :

   git switch experimental

Pour consulter la liste des branches existantes, saisir :

   git branch

L’astérisque devant une branche indique que c’est la branche dans laquelle vous vous situez.

Pour fusionner des branches, vous devrez utiliser la commande « git merge ». À l’aide de « switch », rendez-vous dans le répertoire devant accueillir une nouvelle branche et exécutez à cet endroit la commande précitée en indiquant le nom de la branche à enregistrer. Notre version de travail « experimental » peut par exemple être fusionnée avec le répertoire principal de la façon suivante :

   git switch master

   git merge experimental 

  Pour supprimer une branche particulière, utilisez la suite de commandes « git branch -d » sur la branche de la version qui n’est plus nécessaire. Pour procéder à la suppression il faut se trouver dans une autre branche. L’exemple « toto_branch » peut être supprimé ainsi :

   git branch -d experimental

GIT history

Git history est représenté par une suite de commits. Nous savons que la commande git log can liste ces commits. Chaque première ligne de chaque entrée du résultat de la commande git log donne un nom pour le commit :

    git log

  commit a92a11c39cbd42872g64f5c6b3f42b88ea8149b4

  Author: Nathalie <Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.>

  Date:   Mon 3 oct 13:88:51 2022 -0700    

             merge-base: Clarify the comments on post processing.

Pour voir le détail de ce commit, utiliser la commande « git show » suivie du nom du commit

   git show a92a11c39cbd42872g64f5c6b3f42b88ea8149b4

Il y a d’autres façons de consulter le commit, vous pouvez utiliser les premières initiales du nom du commit :

  git show  a92a11c39c                                     les premiers caractères du nom suffisent

  git show HEAD                                                 commits de la branche courante

  git show experimental                                 commits de la branche « experimental »

La commande rechercher  « git grep » est capable de chercher des occurrences dans n’importe qu’elle version de votre projet . Pour chercher toutes les occurrences de hello dans v2.5 :

  git grep "hello" v2.5

Si vous ne précisez pas le nom du commit, la recherche de « hello » se fera tous les fichiers dans le répertoire courant :

  git grep "hello"

 

Balisage : créer, supprimer et lister des balises dans Git

Git possède une fonction de balisage permettant de marquer l’importance de certains points dans l’historique d’un répertoire. Les balises de ce type sont généralement utilisées pour marquer des versions d’un logiciel, pour qu’elles puissent être consultées facilement et à tout moment dans de gros projets. Dans ce cadre, Git supporte deux types de balises :

  • les balises annotées (« annotated ») sont enregistrées comme des objets indépendants dans la base de données, avec la somme de contrôle individuelle, le message de balisage, la date, le nom et l’adresse email de l’auteur de la balise ainsi que la signature GPG.
  • les balises non annotées (« lightweight ») fonctionnent exclusivement comme des références à un commit, de façon similaire aux branches. Ce type peut également être utilisé si vous avez uniquement besoin de balises temporaires.

Dans Git, vous pouvez créer des balises annotées en utilisant la commande « git tag -a » sur le commit souhaité. Si vous y ajoutez également le paramètre « -m », vous pouvez formuler le message de balisage désiré – entre guillemets droits – directement dans la ligne de commande. Nous avons généré le commit « Toto » que nous avons également associé à une balise avec le message « example tag » :

   git tag -a Toto -m "example tag"

Pour les balises non annotées, il convient de procéder de façon similaire : utilisez simplement la commande de base « git tag » sur le commit souhaité sans autre paramètre. Dans l’exemple de notre tutoriel Git, cela correspondrait à la commande suivante :

   git tag Toto 

 Dès que les balises pour votre répertoire sont disponibles, vous pouvez les afficher à l’aide de la commande « git tag » et des paramètres facultatifs « -l » ou « --list » :

   git tag

   git tag -l

   git tag --list  

Pour supprimer une balise du répertoire de travail local, utilisez la suite de commandes « git tag -d » sur la balise en question. Pour supprimer notre référence à « Toto », il faut donc procéder comme suit :    

   git tag -d Toto 

Comme pour les commits, le transfert des balises dans le répertoire principal s’effectue manuellement. Il faut utiliser le nom de la balise et la commande « git push origin ».

À la place du nom de la balise, vous pouvez également ajouter le paramètre « --tags » qui permet d’enregistrer toutes les balises générées dans le répertoire :

   git push origin --tags

 

Utilisation de "GIT" en salles TME derrière un proxy

Pour l'utilisation de "GIT" en salles TME, il est nécessaire de configurer les paramètres du proxy en procédant de la sorte : dans une console de terminal saisir cette commande :

$ git config --global http.proxy http://proxy.ufr-info-p6.jussieu.fr:3128 
$ git config --global https.proxy http://proxy.ufr-info-p6.jussieu.fr:3128

L'url du dépôt git ne doit pas commencer par git:// mais par http:// ou https:// pour que la communication fonctionne.

 

 GIT par l'exemple : Utiliser GIT en mode collaboratif

Supposons que Stan a commencé un nouveau projet avec un répertoire GIT dans /home/stan/project, et que Saxo qui a un homedir sur la même machine veut collaborer au projet de Stan. Saxo commencera par cette commande :

  saxo$ git clone /home/stan/project myrepo

Cette commande va créer un nouveau répertoire « myrepo » contenant un clone du répertoire de Stan

Saxo fait alors quelques modifications et les transfèrent :

  (edit files)

  saxo$ git commit -a 

Quand Saxo est prêt, il dit à Stan de récupérer les modifications du répertoire /home/Saxo/myrepo au moyen de cette commande :

  stan$ cd /home/stan/project

  stan$ git pull /home/saxo/myrepo master

Cette commande fusionne les modifications de  la branche « master » de Saxo dans la branche courante de Stan. Si Stan a fait ses propres changements dans le même temps, alors Stan peut avoir besoin de fixer les éventuels conflits manuellement.

La commande « git pull » effectue deux opérations : cela récupère les modifications, et cela les fusionne dans la branche courante.

Stan peut effectuer la première partie de son opération « pull » en utilisant la commande « git fetch » sans fusionner avec sa propre branche,  de cette façon :

  stan$ git fetch saxo

Quand Stan récupère les changements de Saxo en utilisant un directory distant, il convient d’utiliser « git remote ». Ce qui est récupéré (via git fetch) est stocké dans une branche distante, dans ce cas : saxo/master.

  stan$ git log -p master..saxo/master

Cette commande montre une liste de toutes les modifications que Saxo a faites depuis qu’il s’est raccordé à la branche master de Stan.

Après examen de ces modifications, Stan est capable de fusionner les modifications dans sa branche master :

  stan$ git merge saxo/master

Cette fusion peut aussi être effectuée en effectuant un pull de sa propre branche distante de cette façon : 

  stan$ git pull . remotes/saxo/master 

Ensuite, Saxo peut mettre à jour son repo avec les derniers changements de Stan

  saxo$ git pull 

On remarquera qu’il n’est pas nécessaire de donner le chemin du repository de Stan, quand Saxo clone le repository de Stan, GIT a conservé l’emplacement du repository de Stan dans la configuration du repository, et cet emplacement est utilisé pour effectuer la commande « git pull »

  saxo$ git config --get remote.origin.url

   /home/stan/project 

La configuration complète créée par « git clone » est visible en utilisant « git config –l »