Concepts Avancés

Versionnement et synchronisation

Comment Git fait pour faire ce qu'il fait de mieux, à savoir le versionnement ?

Tout d'abord, il faut comprendre qu'entre deux commits différents, si des fichiers ont des contenus identiques ils ne seront stockés en dur sur votre machine qu'une seule fois.

De façon analogue, si dans un repertoire, vous possédez 1 000 fichiers ayant un contenu identique mais tous des noms différents, vous n'aurez qu'un seul fichier d'enregistré sur votre disque. Bien entendu, on retrouvera la trace des 1 000 fichiers avec leurs noms dans le récapitulatif, mais le contenu ne sera sauvegardé qu'une et unique fois.

Mais comment est-ce possible ? (cf SHA1)

Dans le cas d'un serveur distant comprenant votre projet, Git vous propose plusieurs protocoles pour récupérer vos données :

A noter que bien évidemment le procole Git est optimisé pour cette opération.

Un autre avantage de Git est qu'il n'éxiste aucune différence de configuration entre un server et un client, puisqu'il suffit de contenir le repertoire du projet pour bénéficier de tout l'historique. Et que par le mécanisme simple du SHA1 étudié plus bas, il est très facile de connaître les commits distants que l'on ne possède pas en local et que l'on voudrait récupérer.

SHA1

SHA1 est un algorithme de Hashage prenant un entrée jusqu'à 264 bits, et retourne une suite unique de 40 caractères Héxadécimaux.


Schéma représentant l'algorithme de hashage SHA1

C'est ce procédé qu'utilise Git pour connaitre les objets qu'il a à sauvegarder. En effet, Git se moque des noms des fichiers, il ne considère que le contenu. En hashant le contenu d'un fichier, il obtient une série de digits unique symbolisant le fichier. Ainsi, si un autre fichier produit la même suite de digits, alors le contenu des deux fichiers est identique et n'ont pas besoin d'etre sauvegardés deux fois.

Les Objets Git

Les objets Git sont définis par trois champs : Leur Type, leur Taille et leur Contenu.

Le contenu d'un objet Git est fait de la façon suivante : Header + contenu.

Le header contient le type d'objet dont il s'agit, la taille en octet, et enfin son contenu

Comme Objets Git on trouve :