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


80

Je me suis toujours demandé pourquoi Git préférait le hachage 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 regarder la révision 1200 ou de commettre 92ba93e! (Juste pour donner un exemple).

Alors, y a-t-il une raison pour cette conception?


3
Vous pouvez baliser un commit avec "v1.0" puis vous référer au commit par cette balise. Voir git-scm.com/book/fr/v2/Git-Basics-Tagging
Michael Durrant

Réponses:


114

Un numéro de révision unique et croissant de façon monotone n'a de sens que pour un système de contrôle de version centralisé, dans lequel toutes les révisions sont transmises à un seul endroit pouvant 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 insérées dans des flux de travail arbitraires, le concept ne s'applique tout simplement pas. (Par exemple, il n’existe pas d’endroit unique pour attribuer des numéros de révision. Si je modifie votre référentiel et que vous décidez un an plus tard d’extraire mes modifications, comment un système peut-il garantir que nos numéros de révision ne sont pas en conflit?)


11
Vous voudrez peut-être examiner Bazaar , un DVCS qui conserve les numéros de révision. La seule garantie est que les numéros de révision sont uniques dans une branche.
krlmlr

3
@krlmlr Person 1: "Hey, <P2>, what was revision 12345 for?" P2: "Revision 12345 was commited by <P3>." P3: "I don't have a revision 12345..."- Si mes souvenirs sont bons , Mercurial a un problème similaire. Par contre, s'ils utilisaient git, ils auraient tous des références identiques pour chaque commit.
Izkata

1
@Izkata: P1: "Do you have revision with the GUID gdlmsnblngoijlafd-35345-fg?"... Bazaar a toujours des GUID ...
krlmlr

5
@Izkata Mercurial n'a pas un problème similaire. Ils utilisent des hashes, tout comme git. Ils fournissent également un nombre de tours uniquement local pour faciliter la frappe.
Hank Gay

1
avec git, les 5 premiers caractères du hachage sont souvent assez uniques pour utiliser un raccourci pour l'identifiant de révision complet.
Mendota

40

Vous avez besoin de hachages dans un système distribué. Supposons que vous et un collègue travaillez tous les deux sur le même référentiel et que vous validez un changement localement, puis que vous le poussez. Qui est le numéro de révision 1200 et qui est le numéro de révision 1201 si aucune des parties ne se connaît mutuellement? La seule solution technique réaliste consiste à créer un hachage des modifications à l'aide d'une méthode connue et à relier les éléments en conséquence.

Fait intéressant, HG prend en charge les numéros de version, mais ils sont explicitement réservés aux utilisateurs locaux. Votre référentiel a un jeu. Le référentiel de votre collègue aura un jeu différent en fonction de la manière dont ils ont été poussés et extraits. Cela rend l’utilisation de la ligne de commande un peu plus conviviale que Git.


34

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 méthode Bazaar . Vous pouvez également utiliser n'importe quel autre identifiant global unique. Les hachages sont une mesure permettant de garantir l’intégrité des données: ils représentent un condensé des informations contenues dans l’objet (commit, arbres, ...) référencés par le hachage. Modifier le contenu sans altérer le hachage (c.-à-d. Une attaque par pré-image ou une attaque par collision ) est considéré comme difficile, bien que pas impossible. (Si vous y tenez vraiment, jetez un coup d'œil au papier de Marc Stevens publié en 2011 ).

Par conséquent, la référence aux objets par leur hachage SHA permet de vérifier si le contenu a été altéré. Et, étant donné qu'ils sont (presque) garantis d'être uniques, ils peuvent également être utilisés en tant qu'identificateurs de révision.

Voir le chapitre 9 du livre Git pour plus de détails.


8
Ce n'est pas une mesure de sécurité, car le hachage peut facilement être recalculé pour un commit modifié. Il est uniquement utilisé pour l'intégrité, afin de vérifier le contenu par rapport au hachage calculé - voir le commentaire de Linus Torvalds sur l'utilisation de SHA-1 dans Git.
Lee

@ Lee: Si le référentiel de Chuck est différent de celui d'Alice et de Bob en termes de hachage de révision, il est garanti que Chuck a également un contenu différent. D'autre part, il est très difficile pour Chuck de fabriquer un référentiel avec des contenus différents qui semblent identiques par rapport à leurs hachages de révision.
krlmlr

@ Lee: Vous avez manqué votre lien. Appelons cela "intégrité des données" alors ...
krlmlr

devrait être la réponse correcte
SuperUberDuper

8

En termes simples:

  • Les hachages sont destinés à être presque universellement uniques. Ce n'est PAS garanti, mais il est extrêmement improbable 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 considérer comme unique.
  • Avec les numéros de révision, vous devez utiliser un espace de noms pour pouvoir vous reporter spécifiquement à la révision 1200.
  • Git peut travailler à la fois distribué et / ou centralisé. Alors, comment obtenir des numéros de révision corrects et uniques?
  • De plus, l'utilisation de numéros de révision créerait une fausse interprétation selon laquelle les révisions les plus récentes devraient avoir des nombres plus élevés, ce qui ne serait pas le cas en raison de la création de branches, de la fusion, du changement de base, etc.
  • Vous avez toujours la possibilité de mettre des balises sur les commits.

32
Pas garanti d'être unique, mais incroyablement susceptible d'être unique. :)
dsw88

@ mustang2009cobra C'est vrai.
Tulains Córdova

1
Il est possible que ma modification ne soit pas acceptée car le hachage est inchangé. Il est beaucoup plus probable que deux météores frappent mon ordinateur et l'ordinateur avec le référentiel à la même seconde, détruisant les ordinateurs et tuant toutes les personnes impliquées.
gnasher729


1

Hash n'est pas la solution unique pour VCS distribué. Mais lorsque vous travaillez avec un système distribué, seul un classement partiel des événements peut être enregistré. (Pour VCS, l'événement peut être une validation.) C'est pourquoi il est impossible de conserver un numéro de révision croissant de manière monotone. Habituellement, nous adoptons quelque chose comme une horloge vectorielle (ou timestamp vectoriel) pour enregistrer une telle relation d'ordre partiel. C'est la solution utilisée à Bazaar .

Mais pourquoi Git n'utilise pas d'horloge vectorielle mais de hachage? Je pense que la cause fondamentale est le choix des cerises . Lorsque nous effectuons un tri sélectif sur un référentiel, la commande partielle des commits est en train de changer. Certaines horloges vectorielles de commits 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 qui se pose avec les hashes.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.