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?
version-control
git
Max Beikirch
la source
la source
Réponses:
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?)
la source
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.P1: "Do you have revision with the GUID gdlmsnblngoijlafd-35345-fg?"
... Bazaar a toujours des GUID ...git
. Ils fournissent également un nombre de tours uniquement local pour faciliter la frappe.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.
la source
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.
la source
En termes simples:
la source
En termes mathématiques:
la source
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.
la source