Qu'est ce qu'un Git commit ID?
Comment le Git commit Id générés pour identifier de manière unique le commet?
Exemple: 521747298a3790fde1710f3aa2d03b55020575aa
Comment ça fonctionne? Sont-ils seulement unique pour chaque projet? Ou pour les dépôts Git à l'échelle mondiale?
Voir git-scm.com/book/en/v2/...
Ne savez pas pourquoi vous obtenez downvoted. Je trouve ce sujet très intéressant.
Ne savez pas pourquoi vous obtenez downvoted. Je trouve ce sujet très intéressant.
OriginalL'auteur Ankur Loriya | 2015-03-17
Vous devez vous connecter pour publier un commentaire.
Un Git commit ID est un Hachage SHA-1 de chaque chose importante à propos de la commettre. Je ne vais pas tous les énumérer, mais ici, c'est le plus important...
Changer tout cela, et de le commettre des changements d'identité. Et oui, même s'engager avec les mêmes propriétés ont le même ID sur une machine différente. Cela sert trois objectifs. Tout d'abord, il signifie que le système peut dire si un commit a été falsifié. Il est cuit à droite dans l'architecture.
Deuxième, on peut rapidement comparer engage juste en regardant leurs papiers d'identité. Cela rend Git de protocoles de réseau très efficace. Voulez comparer deux commits pour voir si elles sont la même chose? N'ont pas à envoyer toute la diff, il suffit d'envoyer l'Id.
Troisième, et c'est là le génie, les deux s'engage avec le même Id la même histoire. C'est pourquoi l'ID de la précédente s'engage font partie de la table de hachage. Si le contenu d'un commit est le même, mais les parents sont différents, la validation d'identité doit être différent. Cela signifie que lors de la comparaison des référentiels (comme dans un push ou pull) une fois que Git trouve un commit en commun entre les deux référentiels, il peut arrêter la recherche. Cela fait en poussant et en tirant extrêmement efficace. Par exemple...
Le réseau conversation pour
git fetch origin
va quelque chose comme ceci...local
Hey origine, les branches qu'avez-vous?origin
J'ai du maître à E.local
Je n'ai pas E, j'ai votre maître de B.origin
B dites-vous? J'ai B et c'est un ancêtre de E. Qui vérifie. Permettez-moi de vous envoyer C, D et E.C'est aussi pourquoi, lorsque vous réécrivez un commit avec git rebase, tout ce qui est après qu'il faut le changer. Voici un exemple.
Disons que vous réécriture D, juste pour changer le message de journal un peu. Maintenant, D ne peut plus être D, il doit être copié dans un nouveau commit, nous allons appeler D1.
Alors que D1 peut avoir C que ses parents C est pas affectée, s'engage ne connaissent pas leurs enfants), il est déconnecté de E, F et G. Si nous changeons E s parent, D1, E ne peut pas être E plus. Il doit être copié dans un nouveau commit E1.
Et ainsi de suite avec F F1 et G de G1.
Ils ont tous le même code, il suffit de parents différents (ou en D1, un autre message de commit).
OriginalL'auteur Schwern
Vous pouvez voir exactement ce que va en faire un commit id en exécutant
Il vous donnera quelque chose comme
Il vous donne:
Git prend tout cela et fait un hash sha1 de la. Vous pouvez reproduire la validation de l'id en cours d'exécution
Cela commence par l'impression de la chaîne
commit
suivi d'un espace et le nombre d'octets de lacat-file
texte blob. Il ajoute ensuite lecat-file
goutte à celle suivie par un octet nul. Tout cela devient alors courir à traverssha1sum
.Comme vous pouvez le voir, il n'y a rien qui identifie le projet ou le dépôt dans cette information. La raison pour que cela ne cause pas de problèmes c'est parce que c'est astronomiquement peu probable pour deux types de commettre des hachages d'entrer en collision.
Il n'est pas pris exactement à partir du code. J'imagine que c'est écrit en C. Mais il reproduit fidèlement l'algorithme (comme maintenant, mais les contributeurs sont de travail sur le remplacement des SHA1).
Est-ce là où vous avez obtenu l'info? gist.github.com/masak/2415865
Probablement. C'est de plus de 2 ans, donc je ne suis pas sûr. De toute façon, bonne trouvaille.
OriginalL'auteur Justin Howard