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 :
<html>
<head>
</head>
<body>
</body>
</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
<html>
<head>
<title>Web et HTML</title>
<meta charset="UTF-8">
</head>
<body>
</body>
</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
<html>
<head>
<title>Web et HTML</title>
<meta charset="UTF-8">
</head>
<body>
<h1>Une page web en HTML</h1>
<h2>sous-titre à mettre</h2>
Contenu à venir !
</body>
</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.
<html>
<head>
<title>Web et HTML</title>
<meta charset="UTF-8">
</head>
<body>
</body>
</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.
<html>
<head>
<title>Web et HTML</title>
<meta charset="UTF-8">
</head>
<body>
<h1>Une page web en HTML</h1>
Terminé
</body>
</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-programmeurs
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.