web-dev-qa-db-fra.com

Pourquoi git utilise-t-il des hachages au lieu des numéros de révision?

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?

83
Max Beikirch

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?)

118
Josh Kelley

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.

40
Wyatt Barnett

Intégrité des données.

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.

34
krlmlr

Dans les mots du profane:

  • Les hachages sont censés être presque universellement uniques. Ce n'est PAS garanti, mais il est extrêmement peu probable que les mêmes SHA soient générés pour un contenu différent. En termes pratiques pour un projet donné, vous pouvez le traiter comme unique.
  • Avec les numéros de révision, vous devrez utiliser un espace de noms afin de vous référer spécifiquement à la révision 1200.
  • Git peut fonctionner à la fois distribué et/ou centralisé. Alors, comment obtenez-vous des numéros de révision corrects et uniques?
  • L'utilisation de numéros de révision créerait également la fausse spectation selon laquelle les révisions plus récentes devraient avoir des nombres plus élevés, et ce ne serait pas vrai en raison de la ramification, de la fusion, du rebasage, etc.
  • Vous avez toujours la possibilité de mettre des balises dans les validations.
8
Tulains Córdova

En termes mathématiques:

5
Bengt

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.

1
Che-Sheng Lin