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 < 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 »