Quelle est la différence entre `Commit hash`,` Parent Hash` et `Tree hash` dans git?

Aujourd'hui, j'apprends quelques connaissances de base en lisant ce document en ligne:

http://git-scm.com/book/fr/v2/Git-Basics-Viewing-the-Commit-Hi

Et à ce chapitre, je commence à apprendre à utiliser git log --pretty=format:" " pour afficher des informations de log à mon goût.

Mais certains comment, j'ai vu dans la table de format deux options similaires, %H pour Commit Hash , %P pour Parent Hash et %T pour Tree Hash .

Je les ai expérimentés sur ma command line, il en ressort qu'ils sont tous des valeurs de hachage de même longueur avec des valeurs différentes.

Je googled et stackoverflowed, aucuns indices évidents jusqu'à présent.

J'ai idée de cette Hash value , c'est une sum de contrôle de ce commit git.

Mais qu'est-ce que Parent Hash et Tree hash font?

  • PS: Ah, j'ai des idées maintenant, est-ce que Parent Hash signifiait la valeur de hachage de l'origine directe d'une twig?

Hash parent:

 $ git log --graph * commit c06c4c912dbd9ee377d14ec8ebe2847cf1a3ec7e |\ Merge: 79e6924 3113760 | | Author: linjie <[email protected]> | | Date: Mon Mar 14 16:02:09 2016 +0800 | | | | commit5 | | | | Merge branch 'dev' | | | * commit 31137606f85d8960fa1640d0881682a081ffa9d0 | | Author: linjie <[email protected]> | | Date: Mon Mar 14 16:01:26 2016 +0800 | | | | commit3 | | * | commit 79e69240ccd218d49d78a72f33002fd6bc62f407 |/ Author: linjie <[email protected]> | Date: Mon Mar 14 16:01:59 2016 +0800 | | commit4 | * commit 7fd4e3fdddb89858d925a89767ec62985ba07f3d | Author: linjie <[email protected]> | Date: Mon Mar 14 16:01:00 2016 +0800 | | commit2 | * commit 316dd3fb3c7b501bc9974676adcf558a18508dd4 Author: linjie <[email protected]> Date: Mon Mar 14 16:00:34 2016 +0800 commit1 $ git log --pretty=format:'%<(82)%P %s' 79e69240ccd218d49d78a72f33002fd6bc62f407 31137606f85d8960fa1640d0881682a081ffa9d0 commit5 7fd4e3fdddb89858d925a89767ec62985ba07f3d commit4 7fd4e3fdddb89858d925a89767ec62985ba07f3d commit3 316dd3fb3c7b501bc9974676adcf558a18508dd4 commit2 commit1 

Vous pouvez voir commit4 et commit3 est parent de commit5 , commit2 est parent de commit3 et commit4 , commit1 est parent de commit2 .

Hachoir d'tree:

 $ git log --pretty=format:'%T %s' f3c7cee96f33938631a9b023ccf5d8743b00db0e commit5 e0ecb42ae45ddc91c947289f928ea5085c70b208 commit4 d466aea17dc07516c449c58a73b2dc3faa9d11a1 commit3 b39f2e707050e0c5bbb3b48680f416ef05b179ba commit2 5706ec2b32605e27fa04cbef37d582325d14dda9 commit1 $ git cat-file -p f3c7ce 100644 blob 8bb2e871e94c486a867f5cfcbc6f30d004f6a9e5 dev 100644 blob 47f16c8e00adba77ec5c176876e99c8e9f05d69b master $ git cat-file -p 5706ec 100644 blob fc0bfde0d44bb4d6c7d27b6e587ebedd34ba5911 master 

La fonction de la command: Imprime le contenu de <object> fonction de son type.

 git cat-file -p 

Dans git, tout le contenu est stocké sous forme d'objects tree et blob, avec des trees correspondant à des inputs de directory UNIX et des blobs correspondant plus ou less aux inodes ou au contenu des files. Un object arborescence unique contient une ou plusieurs inputs d'arborescence, dont chacune contient un pointeur SHA-1 vers un blob ou une sous-arborescence avec son mode, son type et son nom de file associés. Git crée normalement un tree en prenant l'état de votre zone de transfert ou index et en écrivant une série d'objects arborescents. Les objects de validation ont les informations sur qui a enregistré l'object arborescence, quand ils ont été sauvegardés ou pourquoi ils ont été enregistrés. Ceci est l'information de base que l'object de validation stocke pour vous.

Conclusion:

Commit hash, hash Parent, Tree hash sont tous SHA-1. Commit Hash et Parent hash est identique sauf Parent hash a child. Le hachage d'tree représente un object Tree. Commit hash et Parent hash représentent un object commit.

Référence:

  1. Git Internals – Objets Git

  2. git-cat-file – Fournit du contenu ou des informations de type et de taille pour les objects du référentiel

"Commit Hash" est le hachage pour la validation en cours. Le commit auquel l'input est associée.

"Parent Hash" est le hash pour toute twig parent (es) dont provient le commit.

"Tree hash" est le hash du directory courant dans le commit. Le hachage est égal au hachage que le directory a vu depuis le directory parent avec git ls-files --stage --abbrev .

Référence:

Un tree est une collection hiérarchique de files et de directorys, non liée à un point particulier de l'histoire. Par exemple, si vous créez un file et ensuite supprimez le file (sans autres validations intermédiaires), vous obtiendrez le même tree que vous avez commencé.

Un commit est un point dans l'histoire de votre projet. Un commit spécifie une arborescence, mais contient également d'autres informations telles que author / committer et time, un message de commit (dans lequel l'auteur décrit ce qui a changé) et surtout zéro ou plus parents qui sont l'état précédent du référentiel. (Votre tout premier commit a zéro parents. La plupart des commit après avoir un parent pendant le développement linéaire, et plus d'un si vous fusionnez.)

Vous pouvez avoir une idée de la façon dont cela fonctionne avec la command git cat-file -p , qui imprime le contenu d'un hachage particulier, quel que soit le type. Par exemple, pour regarder la validation HEAD, vous pouvez exécuter:

 $ git cat-file -p HEAD tree 81ca1cb660ea79131336944df28b13b711d93557 parent 92b6b8fe9956866ace5397e060e7cc8ee1c76233 parent 7ea2575ed96d150ee19f70edea4bd42c7c2f0b83 author Mislav MarohniÄ <[email protected]> 1436468108 -0700 committer Mislav MarohniÄ <[email protected]> 1436468108 -0700 Merge pull request #951 from github/global-args Avoid depending on a hardcoded list of git global flags 

Pour voir l'tree à l'intérieur de cette validation, vous pouvez cat-file -p c'est l'tree:

 $ git cat-file -p 81ca1cb660ea79131336944df28b13b711d93557 100644 blob 730f77a3be502cfe6769c1305c0b59c22274caf5 .gitignore 100644 blob bcbd000f6b9ad5b0510f804ac4a3b19306b39c03 .travis.yml 100644 blob da71aa1fa3c3ae47b2fe5e6245ce2eea1586e278 CONTRIBUTING.md ... 

De même, si vous regardez les parents, vous verrez que ce sont aussi des engagements. Un raccourci pour l'tree dans un commit tel que rev est rev^{tree} . Donc la command précédente aurait pu être écrite git cat-file -p HEAD^{tree} . Notez que rev^ représente le parent de rev . Quand il y a plusieurs parents, rev^1 , rev^2 , etc. Plus d'informations sont disponibles sur la page man de git rev-parse .