đȘ Git#

Note
Nous allons nous intĂ©resser Ă lâaspect gestion de versions de Git: Comment enregistrer lâhistorique des modifications apportĂ©es Ă un projet.
Le problĂšme#
Le code est plus souvent lu quâĂ©crit
âGuido van Rossum
La dĂ©marche naturelle quand on commence Ă travailler longuement sur un projet pour lequel on veut Ă©viter dâeffacer et/ou de perdre son code Ă cause dâune erreur humaine est de dupliquer les fichiers et de crĂ©er des versions multiples dâun mĂȘme fichier qui sont des instantanĂ©s Ă un moment donnĂ©e:
- rapport.doc
- rapport_v1.1.doc
- rapport_v1.doc
- rapport_v2.doc
- rapport_v2_beta.doc
- rapport_vfinale.doc
Il sâagit dâune maniĂšre trĂšs artisanale de procĂ©der et qui est susceptible dâĂȘtre Ă la merci dâune erreur humaine.
La version la plus Ă jour est-elle rapport.doc
ou rapport_vfinale.doc
? Et si on avait un fichier rapport_vfinale2.doc
?
La gestion des versions est un travail fastidieux et méthodique, spoiler, les humains ne sont pas doués pour les travaux fastidieux et méthodique.
Laissons cela Ă la machine et concentrons-nous sur la partie du travail oĂč nous sommes meilleurs que la machine.
Version Control System#
Initialement il sâagit dâune famille de logiciels dĂ©diĂ©s Ă la gestion de code source pour les projets logiciels et Ă©galement Ă la documentation, site web, etc.
Leur objectif est de faciliter le travail collaboratif en simplifiant la facilitĂ© dâĂ©change des fichiers et de leurs versions, la traçabilitĂ© des modifications et la gestion des conflits.
Il existe deux grandes familles de VCS:
- SystÚmes centralisés:
CVS (Concurrent Versioning System) vieillissant
SVN (Subversion) populaire il y a quelques temps dĂ©jĂ
- SystÚmes décentralisés:
Git
Mercurial (Hg)
Bazaar (bzr)
Ces derniers présentent de nombreux avantages:
Une sauvegarde (modulo la synchronisation avec un serveur distant)
La conservation de lâhistorique (nominatif) des fichiers « Qui a fait quoi en somme »
La possibilité de retour en arriÚre
La fusion des modifications lors du travail collaboratif
La visualisation des changements au cours du temps
Git#
Il sâagit dâun logiciel de gestion de versions dĂ©centralisĂ©, créé par Linus Torvalds (auteur du noyau Linux), sa popularitĂ© sâexplique par sa rapiditĂ© (mise en oeuvre et exĂ©cution), le travail par branches possible.
Celui-ci est assez complexe Ă utiliser, comme tout les CVS, toutefois quelques commandes suffisent pour une utilisation quotidienne.
Initialement il sâagit dâun logiciel pour Linux, il existe maintenant une version pour Windows.
Attention
Lâutitilisation de Git
nécessite certaines notions préalables:
Fonctionnement dâun filesystem
Connaissance basique du terminal Linux
Potentiellement, un grand nombre de commandes
Indication
GIT est conçu pour les fichiers de type texte, toutefois il fonctionne aussi bien avec des fichiers binaires (images, bureautique, etc.).
Notion de base#
- DépÎt - repository
Le répertoire caché
.git
est nommĂ© dĂ©pĂŽt (repository), il contient toutes les donnĂ©es dont Git a besoin pour gĂ©rer lâhistorique, seul les commandes Git peuvent modifier son contenu.- Commit
Lâhistorique dâun projet est une sĂ©quence de snapshot contenant lâĂ©tat de tous les fichiers du projet. Il sâagit des commits qui possĂšdent: - une date - un auteur - une description textuelle
Note
En pratique GIT ne stocke pas la totalitĂ© des fichiers pour chaque commit mais seulement les diffĂ©rences par rapport Ă lâĂ©tat suivant. Ceci a pour avantage dâĂȘtre moins coĂ»teux en stockage.
- Copie de travail
Working copy, il sâagit des fichiers prĂ©sents dans le rĂ©pertoire gĂ©rĂ© par Git, leur Ă©tat peut ĂȘtre diffĂ©rent du dernier commit de lâhistorique.
- Index
Il sâagit dâun espace temporaire contenant les modifications prĂȘtes Ă ĂȘtre « commitĂ©es ». Ces modifications peuvent ĂȘtre une crĂ©ation de fichier, une modification de fichier ou encore une suppression de fichier.
Utilisation de la commande git
#
$ git init
Note
Initialise la gestion de version dans un répertoire (le répertoire courant) en créant le sous-répertoire .git
$ git status
$ git diff
$ git add <filename>
$ git reset <filename>
$ git commit -m "Ceci est un commentaire pertinent"
Attention
Avant toute utilisation de la commande commit
, il convient dâajouter des Ă©lĂ©ments Ă lâindex via la commande add
Commande git |
Visualisation dans lâhistorique |
---|---|
|
![]() |
|
![]() |
|
![]() |
$ git log
$ git show <commit-id>

Cycle de vie des commandes git en local#
DépÎt distant#
Un Remote repository est un dépÎt GIT tout à fait similaire à un dépÎt local mais accessible via une URL.
Indication
Un dĂ©pĂŽt local peut ĂȘtre liĂ© Ă un dĂ©pĂŽt distant
Lâutilisation dâun remote repository prĂ©sente lâintĂ©rĂȘt
dâune sauvegarde Ă distance du projet,
dâun travail sur plusieurs machines
dâun projet accessible facilement
et dâune collaboration Ă plusieurs sur un projet

Cycle de vie des commandes git via un dépÎt distant#
Sa mise en oeuvre passe par plusieurs étapes:
Créer un dépÎt sur un serveur (gitlab.com, framagit.org, github.com, etc.)
Cloner un dépÎt distant
Publier des commits
Récupérer les commits
$ git clone <repository-url>
$ git push <repository-name> <branch-name>
Note
repository-name: par défaut
origin
branch-name: par défaut
master
Désynchronisation
Le push nâest possible que si la branche locale contient tous les commits de la branche distante.
Si la branche distante contient des commits inconnus en local, il faudra au préalable les récupérer.
$ git pull
Important
Cette opération copie dans le dépÎt local les commits distants et met à jour la copie de travail.
Pour éviter les problÚmes avec Git#
- Quand réaliser un commit ?
DĂšs quâil y a une avancĂ©e du programme qui fonctionne.
Ne pas commiter du code qui ne fonctionne pas.
Le concepteur de Git, Linus Torvalds, préconise de commiter le plus souvent possible.
- Quand réaliser un push ?
DĂšs que des fonctionnalitĂ©s deviennent intĂ©ressante pour les autres membres de lâĂ©quipe.
Afin de pas perturber les autres membres de lâĂ©quipe, il faut Ă©viter de rĂ©aliser des pushs Ă rĂ©pĂ©tition.
Il est possible dâĂ©diter un commit avant quâil ne soit publiĂ©.
Une fois quâun commit est publiĂ© : il ne peut plus ĂȘtre modifiĂ©.
Ne pas versionner les fichiers inutiles
Tous les fichiers ne doivent pas ĂȘtre soumis au gestionnaire de versions (les fichiers temporaire, le .exe gĂ©nĂ©rĂ© par Visual Studio, etc.)
Lâutilisation du fichier .gitignore
est plus que recommandĂ© notamment par lâutilisation du site gitignore.io pour gĂ©nĂ©rer un fichier .gitignore
de base.
Les branches#
Lors du dĂ©veloppement dâun logiciel, il est primordial dâintroduire une nouvelle fonctionnalitĂ© sans « casser » le projet.
On souhaite basculer instantanément de la version stable à la version en développement.
Câest ce que nous permettent de faire les branches.
Note
La branche par défaut master
, lâidĂ©ale serait de ne jamais commiter dans master.
Il convient de créer des branches feature_{x}
lorsque une fonctionnalité est développée (dans la réalité, il y a autant de branche feature que de fonctionnalité à developper).
Pour les corrections urgentes, lâutilisation des branches hotfix_{x}
est recommandée.
Ainsi la branche master ne contient que du code propre. Si un utilisateur fait une erreur, il nâimpact que sa propre branche : il ne pollue pas lâensemble du dĂ©pĂŽt.
Création de branche#
$ git branch <NOM>
Depuis la branche parente, souvent master
$ git checkout -b feature_x
$ git checkout master
Fusion de branches#
Le sprint a Ă©tĂ© lancĂ©. Une fonctionnalitĂ© Ă Ă©tĂ© dĂ©veloppĂ©e, elle est terminĂ©e : il faut donc lâintĂ©grer Ă la branche master
.
Avertissement
La fusion se fait sur la branche courante, pensez Ă changer de branche avant de fusionner !
master
#$ git checkout master
$ git merge feature_x
Note
Si la branche feature_x nâa pas Ă©tĂ© modifiĂ©e depuis le dĂ©but du dĂ©veloppement de la fonctionnalitĂ© alors Git intĂ©gre les commits de feature_x Ă master. Il sâagit du merge fast-forward. La branche master et feature_x sont dĂ©sormais Ă©quivalentes, il convient de supprimer feature_x.
Si la branche feature_x avait Ă©voluĂ© avant la fin du dĂ©veloppement de la fonctionnalitĂ©. Le merge fast-forward nâaurait pas Ă©tĂ© possible !Un nouveau commit aurait Ă©tĂ© créé par Git pour fusionner les deux branches.
Important
Si on souhaite conserver la branche feature_x distincte de master
$ git merge --no-ff feature_x
Un commit de fusion des deux branches sera créé, lâhistorique est prĂ©servĂ©.
Branches de développement#
Pour corriger un bug numéroté 1138
, nous devons entreprendre les actions suivantes:
CrĂ©ation dâune branche
bugfix_1138
Ă partir de la branche stable (master)Bascule sur la branche
bugfix_1138
Correction du bug (commit/push)
Fusion de la branche
bugfix_1138
avec la master via la commandemerge
Commande git |
Historique git |
---|---|
$ git commit -m "Initial commit"
$ git commit -m "Add app.py"
|
![]() |
$ git branch bugfix_1138
$ git checkout bugfix_1138
|
![]() |
$ git commit -m 'Fix issue on int'
|
![]() |
$ git checkout master
$ git merge bugfix_1138
|
![]() |
Une petite mise en jambe avec Git#
Pour obtenir un dépÎt Git sur lequel travailler, deux options sont possibles:
CrĂ©ation dâun dĂ©pĂŽt vide,
Copie (clone dans le langage Git) dâun dĂ©pĂŽt existant pour travailler sur une copie de travail.
Nous nous intĂ©resserons Ă la deuxiĂšme option qui fait partie de la vie courante dâun dĂ©veloppeur.
Git a plusieurs interfaces utilisateur, la plus complĂšte Ă©tant lâinterface en ligne de commande (CLI) nous nous servirons de celle-ci.
Ă faire
Tout dâabord il convient de crĂ©er un compte sur une forge git comme Gitlab.
CrĂ©er un premier repository HelloWorld via lâinterface en ligne de Gitlab
Cloner ce repository sur votre ordinateur via la commande
clone
Quel commande utiliser pour afficher le statut de ce dépÎt ?
Attention
Attention Ă partir de maintenant nous nâutiliserons lâinterface web de gitlab uniquement pour constater les changements de donnĂ©es sur notre dĂ©pot distant. Lorsquâil vous est demandĂ© de crĂ©er des fichiers, il convient de le faire sur votre machine via un Ă©diteur de code.
Astuce
Un fichier readme (en français, lisezmoi) est un fichier contenant des informations sur les autres fichiers du mĂȘme rĂ©pertoire. Lâextension .md indique quâil sâagit dâun fichier formatĂ© en Markdown.
Ă faire
Créer le fichier README.md
Ajouter Ă ce fichier le contenu suivant:
# HelloWorld
## About
A simple repo for learning git
## Author
Insert your name here
Pour intĂ©grĂ©e dans lâhistorique des rĂ©visions du dĂ©pĂŽt (pour ĂȘtre « committĂ©e »), chaque modification doit suivre le workflow suivant:
Note
La modification est dâabord effectuĂ©e sur la copie de travail;
Elle est ensuite mémorisée dans une aire temporaire nommée index avec la commande
git add
;Enfin ce qui a Ă©tĂ© placĂ© dans lâindex peut ĂȘtre « committé » avec la commande
git commit
Diagramme UML du Workflow dâune modification avec Git#
Vérifiez avec git status
lâĂ©tat dans lequel se trouve votre dĂ©pĂŽt. Vos modifications (lâajout du fichier README.md) devraient ĂȘtre prĂ©sentes seulement dans la copie de travail.
Ă faire
Préparez README.md pour le commit avec
git add README.md
.Utilisez
git status
Ă nouveau pour vĂ©rifier que les modifications ont bien Ă©tĂ© placĂ©es dans lâindex.Commitez votre modification avec
git commit -m "<votre_message_de_commit>"
. Le message entre double quotes décrira la nature de votre modification (généralement inférieur à 65 caractÚres).Exécutez à nouveau:code:git status, pour vérifier que vos modifications ont bien été commités.
Essayez à présent la commande
git log
pour afficher la liste des changements effectués dans ce dépÎt ; combien y en a-t-il ? Quel est le numéro (un hash cryptographique en format SHA1) du dernier commit effectué ?
Vos modifications sont prises en compte dans votre dépÎt local, toutefois via la commande git status
vous pouvez remarquer que le commit nâest pas publiĂ© sur le dĂ©pĂŽt distant.
Diagramme UML du Workflow dâune modification avec Git#
Ă faire
Publiez votre commit avec
git push origin master
. Que signifie origin et master ?Exécutez à nouveau
git status
, pour vérifier que votre commit a bien été publié.
Une histoire de Burger
Dans note repository nous allons créer un répertoire sandwich
qui contiendra le fichier burger.txt
.
Le fichier burger.txt
contient la liste des ingrĂ©dients dâun burger, un ingrĂ©dient par ligne.
steak
salade
tomate
cornichon
fromage
Ă faire
Comment vĂ©rifier que ce fichier nâest pas versionnĂ© ?
Comment lâajouter Ă lâindex ?
Comment le « committer » ?
Comment publier ce commit ?
Ă faire
Créez quelques autres sandwichs hot_dog.txt
, jambon_beurre.txt et modifiez les compositions déjà créés, en committant chaque modification séparément.
Chaque commit doit contenir une et une seule création ou modification de fichier. Effectuez au moins 5 modifications différentes (et donc 5 commits différents).
à chaque étape essayez les commandes suivantes :
git diff
avantgit add
pour observer ce que vous allez ajouter Ă lâindex;git diff --cached
aprĂšsgit add
pour observer ce que vous allez committer.
Regardez maintenant lâhistorique des modifications avec git log
et vérifiez avec git status
que vous avez tout commité.
Voyage dans le temps
Vous voulez changer dâavis entre les diffĂ©rents Ă©tats de la Figure sur lâĂ©tat des modifications ? Faites une modification dâun ou plusieurs sandwichs, ajoutez-la Ă lâindex avec git add
(vérifiez cet ajout avec git status
), mais ne la commitez pas. Exécutez git rest
sur le nom de fichier (ou les noms de fichiers) que vous avez préparés pour le commit ; vérifiez avec git status
le résultat.
Ă faire
- Votre modification a Ă©tĂ© « retirĂ©e » de lâindex.
Vous pouvez maintenant la jeter Ă la poubelle avec la commande
git checkout
sur le ou les noms des fichiers modifiĂ©s, qui rĂ©cupĂšre dans lâhistorique leurs versions correspondant au tout dernier commit.Essayez cette commande, et vĂ©rifiez avec
git status
quâil nây a maintenant plus aucune modification Ă commiter.
- Regardez lâhistorique de votre dĂ©pĂŽt avec
git log
; choisissez dans la liste un commit (autre que le dernier).
Exécutez
git checkout COMMITID
oĂčCOMMITID
est le numĂ©ro de commit que vous avez choisi.VĂ©rifiez que lâĂ©tat de vos sandwichs est maintenant revenu en arriĂšre, au moment du commit choisi.
Que dit maintenant
git status
?
- Regardez lâhistorique de votre dĂ©pĂŽt avec
Vous pouvez retourner à la version plus récente de votre dépÎt avec
git checkout master
.Vérifiez que cela est bien le cas. Que dit maintenant
git status
?