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

12

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

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

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

Mais certains comment, j'ai vu dans le tableau des formats deux options similaires, %Hpour Commit Hash, %Ppour Parent Hashet %Tpour Tree Hash.

Je les ai expérimentés sur ma ligne de commande, il ressort que ce sont tous des valeurs de hachage de même longueur avec des valeurs différentes.

J'ai googlé et empilé, aucun indice évident jusqu'à présent.

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

Mais qu'est-ce que Parent Hashet Tree hashquoi faire?

  • PS: Ah, j'ai maintenant quelques idées, est-ce que cela Parent Hashsignifie la valeur de hachage de l'origine directe d'une branche?
Zen
la source

Réponses:

7

Hachage 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 .

Hachage d'arbre:

$ 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 commande: affiche assez le contenu de <object>son type.

git cat-file -p 

Dans git, tout le contenu est stocké sous forme d'arborescence et d'objets blob, avec des arborescences correspondant aux entrées du répertoire UNIX et des blobs correspondant plus ou moins aux inodes ou au contenu des fichiers. Un seul objet d'arborescence contient une ou plusieurs entrées d'arborescence, chacune contenant un pointeur SHA-1 vers un blob ou une sous-arborescence avec son mode, son type et son nom de fichier associés. Git crée normalement un arbre en prenant l'état de votre zone de transit ou index et en y écrivant une série d'objets d'arbre. Les objets de validation contiennent des informations sur qui a enregistré l'objet arborescent, quand ils l'ont enregistré ou pourquoi ils l'ont été. Il s'agit des informations de base que l'objet commit stocke pour vous.

Conclusion:

Le hachage de validation, le hachage parent, le hachage d'arbre sont tous SHA-1. Le hachage de validation et le hachage parent sont identiques, sauf que le hachage parent a un enfant. Le hachage d'arbre est un objet Tree. Le hachage de validation et le hachage parent représentent un objet de validation.

Référence:

  1. Git Internals - Objets Git

  2. git-cat-file - Fournit des informations sur le contenu ou le type et la taille des objets du référentiel

linjie
la source
4

Une arborescence est une collection hiérarchique de fichiers et de répertoires, non liée à un point particulier de l'histoire. Par exemple, si vous créez un fichier, puis supprimez le fichier ultérieurement (sans autres validations intermédiaires), vous vous retrouverez avec la même arborescence que celle avec laquelle 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 l'auteur / committer et l'heure, un message de commit (dans lequel l'auteur décrit ce qui a changé), et surtout zéro ou plusieurs parents, qui sont l'état précédent du référentiel. (Votre tout premier commit n'a aucun parent. La plupart des commit après cela ont 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 git cat-file -pcommande, qui imprime le contenu d'un hachage particulier, quel que soit le type. Par exemple, pour consulter 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'arbre à l'intérieur de ce commit, vous pouvez cat-file -pson arbre:

$ 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 commits. Un raccourci pour l'arbre à l' intérieur d' une validation comme revest -à rev^{tree}. Ainsi, la commande 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 dans le rev-parse page man git .

user3188445
la source
2

"Commit Hash" est le hachage du commit actuel. Le commit auquel l'entrée est associée.

"Parent Hash" est le hachage de toutes les branches parentes d'où provient la validation.

"Hachage d'arbre" est le hachage du répertoire courant dans la validation. Le hachage est égal au hachage du répertoire s'il est vu depuis le répertoire parent avec git ls-files --stage --abbrev.

Référence:

Braiam
la source
1
que commit hassignifie au début de votre 3ème paragraphe?
Zen