Je me suis toujours demandé pourquoi git préfère les hachages aux numéros de révision. Les numéros de révision sont beaucoup plus clairs et plus faciles à consulter (à mon avis): il y a une différence entre dire à quelqu'un de jeter un œil à la révision 1200 ou de valider 92ba93e! (Juste pour donner un exemple).
Alors, y a-t-il une raison à cette conception?
Un numéro de révision unique, à augmentation monotone, n'a vraiment de sens que pour un système de contrôle de version centralisé, où toutes les révisions vont à un seul endroit qui peut suivre et attribuer des numéros. Une fois que vous entrez dans le monde DVCS, où de nombreuses copies du référentiel existent et où des modifications sont extraites et transférées dans des flux de travail arbitraires, le concept ne s'applique tout simplement pas. (Par exemple, il n'y a pas un seul endroit pour attribuer des numéros de révision - si je bifurque votre référentiel et que vous décidez un an plus tard de retirer mes modifications, comment un système pourrait-il garantir que nos numéros de révision n'entrent pas en conflit?)
Vous avez besoin de hachages dans un système distribué. Disons que vous et un collègue travaillez tous les deux sur le même référentiel et que vous validez tous les deux localement, puis appuyez dessus. Qui peut être le numéro de révision 1200 et qui est le numéro de révision 1201 étant donné qu'aucune des parties ne se connaît? La seule solution technique réaliste consiste à créer un hachage des modifications à l'aide d'une méthode connue et à relier les choses en fonction de cela.
Fait intéressant, HG prend en charge les numéros de version, mais ils sont explicitement une fonctionnalité locale uniquement - votre référentiel a un ensemble, le dépôt de votre collègue aura un ensemble différent selon la façon dont ils ont poussé et tiré. Cela rend l'utilisation de la ligne de commande un peu plus conviviale que Git.
Je suis respectueusement en désaccord avec les réponses actuelles. Les hachages ne sont pas nécessaires pour un DVCS, voir à la manière de Bazaar . Vous pouvez faire de même avec tout autre type d'identifiant globalement unique. Les hachages sont une mesure pour garantir l'intégrité des données: ils représentent un condensé des informations contenues dans l'objet (commit, arbres, ...) référencées par le hachage. La modification du contenu sans altération du hachage (c'est-à-dire une attaque de pré-image ou attaque par collision ) est considérée comme difficile, mais pas impossible. (Si vous êtes vraiment dedans, jetez un œil au article de Marc Stevens de 2011 ).
Par conséquent, se référer aux objets par leur SHA hachage permet de vérifier si le contenu a été falsifié. Et, étant donné qu'ils sont (presque) garantis d'être uniques, ils peuvent être utilisés comme révision identificateurs, aussi - de manière pratique.
Voir Chapitre 9 du livre Git pour plus de détails.
Dans les mots du profane:
En termes mathématiques:
Le hachage n'est pas la solution unique pour les VCS distribués. Mais lorsqu'il s'agit d'un système distribué, seul l'ordre partiel des événements peut être enregistré. (Pour VCS, l'événement peut être un commit.) C'est pourquoi il est impossible de maintenir un numéro de révision croissant de façon monotone. Habituellement, nous adoptons quelque chose comme horloge vectorielle (ou horodatage vectoriel) pour enregistrer une telle relation ordonnée partielle. C'est la solution utilisée dans Bazaar .
Mais pourquoi Git n'utilise pas d'horloge vectorielle mais de hachage? Je pense que la cause première est le choix . Lorsque nous effectuons une sélection sur un référentiel, l'ordre partiel des validations change. Certaines horloges vectorielles de validations doivent être réaffectées pour représenter le nouvel ordre partiel. Cependant, une telle réaffectation dans un système distribué induirait des horloges vectorielles incohérentes. C'est le vrai problème auquel les hachages doivent faire face.