Git : un gestionnaire de code

Un gestionnaire de code est un outil permettant au programmeur de suivre dans le temps et de partager son travail de développement.

Il permet de :

  • Gérer les différentes versions d'un programme

  • Développer plusieurs fonctionnalités en parallèle

  • Développer à plusieurs en partageant un même source

La fonction de « versioning »

Sauvegarder les modifications successives d'un programme

Le suivi de version (versioning) consiste à mémoriser l'état d'un programme au fur et à mesure de son écriture.

Chaque cercle représente une « photo » de l'état du code à un instant donné.

Avantages :

  • Mémoriser les étapes successives du développement

  • Annuler certaines étapes (revert) pour revenir en arrière.

  • Afficher les différences entre différentes versions du programme

Fondamental

C'est au programmeur de choisir les moments où il souhaite réaliser un enregistrement. Tout enregistrement s'accompagne d'un commentaire décrivant les développements réalisés.

Sauvegarder les modifications successives d'un programme

Illustration

Votre programme commence par le code d'une page web vide ci-dessous :

1
<!DOCTYPE HTML>
2
<html>
3
    <head>
4
        
5
    </head>
6
7
    <body>
8
       
9
    </body>
10
</html>   

La sauvegarde de ce code donne la photo v1 ci-dessous.

Le développement continue en ajoutant du code dans l'entête de la page web

1
<!DOCTYPE HTML>
2
<html>
3
    <head>
4
        <title>Web et HTML</title>
5
        <meta charset="UTF-8"> 
6
    </head>
7
8
    <body>
9
       
10
    </body>
11
</html>   

La sauvegarde crée l'état v2 dans l'historique des sauvegardes

Le développement continue avec du code ajouter dans la partie <body> de la page

1
<!DOCTYPE HTML>
2
<html>
3
    <head>
4
        <title>Web et HTML</title>
5
        <meta charset="UTF-8"> 
6
    </head>
7
8
    <body>
9
      	<h1>Une page web en HTML</h1>
10
				<h2>sous-titre à mettre</h2>
11
        Contenu à venir !
12
13
    </body>
14
</html>   

La sauvegarde de cet état est mémorisée par le commit v3

Possibilité d'annuler des modifications correspondant à un enregistrement (commit) : ci-dessous, le commit v3 est annulé ce qui crée une version v4 ne contenant plus les ajouts du commit v3.

1
<!DOCTYPE HTML>
2
<html>
3
    <head>
4
        <title>Web et HTML</title>
5
        <meta charset="UTF-8"> 
6
    </head>
7
8
    <body>
9
       
10
    </body>
11
</html>   

La trace de l'annulation de la sauvegarde v3 est conservée dans l'historique

Le développement reprend en ajoutant des lignes de code.

1
<!DOCTYPE HTML>
2
<html>
3
    <head>
4
        <title>Web et HTML</title>
5
        <meta charset="UTF-8"> 
6
    </head>
7
8
    <body>
9
       <h1>Une page web en HTML</h1>
10
       Terminé  
11
12
    </body>
13
</html>   

Un autre commit vient enregistrer cette version finalisée du programme​.

Mener plusieurs développements en parallèle

Le développeur crée différentes branches selon les fonctionnalités qu'il est train de développer.

Une branche est une copie complète de l'ensemble du programme (ou du projet).

Lorsque le développement sur la branche est terminée, elle est fusionnée avec la branche principale (main)

Exemple 1 : développement successif de fonctionnalité aux travers de branches

Exemple 2 : développement en parallèle de plusieurs fonctionnalités par un même programmeur

Dans cet exemple la fusion de la branche fct1 sur le main peut engendrer des conflits avec les modifications apportées par la branche fct2. Au moment de la fusion de fct1, il peut être nécessaire de gérer ces conflits pour que la fusion soit effective.

Exemple 3 : développement d'une sous-fonctionnalité au sein d'une fonctionnalité.

Fondamental

En pratique, il faut développer sur une branche et ramener le code sur le main lorsqu'il est finalisé.

Fondamental

Une branche ne doit servir qu'à une seule fonctionnalité. Elle doit être arrêtée après fusion. Le développement d'une nouvelle fonctionnalité implique la création d'une nouvelle branche.

La dimension multi-programmeur​s

Les gestionnaires de versions permettent aussi le suivi et l'intégration de code écrit par plusieurs programmeurs.

Un serveur (Git) est nécessaire pour permettre de gérer l'échange des travaux entre les programmeurs

Le projet avec ses branches est partagé entre les différents programmeurs.

Plusieurs programmeurs peuvent travailler sur une même branche et contribuer au développement d'une même fonctionnalité.

Chaque programmeur réalise une copie du projet (un clone) et le modifie localement.

Le principe de commit, de branche et de fusion s'applique localement sur la copie.

Lorsqu'un développeur a suffisamment avancé ou souhaite partager son travail, il re-dépose le projet sur le serveur en gérant les éventuels conflits liés aux apports des autres programmeurs.

Lorsque le développement sur une branche est finalisée, le développeur réalise sur le serveur une demande de fusion dans la branche principale. Cette demande est traitée par un développeur seul habilité à la réaliser.