Яка різниця між `Командним хешем`,` Батьківським хешем` та `Деревним хешем` у git?


12

Сьогодні я вивчаю деякі основні знання з git, читаючи цей документ в Інтернеті:

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

І в цій главі я починаю вчитися використовувати git log --pretty=format:" "для показу інформації журналу на свій смак.

Але дещо, як я побачив у таблиці форматів два подібних варіанти, %Hдля Commit Hash, %Pдля Parent Hashта %Tдля Tree Hash.

Я експериментував з ними в моєму командному рядку, виходить, що всі вони мають хеш-значення однакової довжини з різним значенням.

Я гуглився і переповнювався, досі жодних очевидних натяків.

Я маю уявлення про це Hash value, це контрольна сума цього git.

Але що робить Parent Hashі Tree hashробить?

  • PS: Ах, зараз у мене є деякі ідеї, чи Parent Hashозначало хеш-значення прямого походження галузі?

Відповіді:


7

Батьківські хеші:

$ git log --graph
*   commit c06c4c912dbd9ee377d14ec8ebe2847cf1a3ec7e
|\  Merge: 79e6924 3113760
| | Author: linjie <linjielig@gmail.com>
| | Date:   Mon Mar 14 16:02:09 2016 +0800
| |
| |     commit5
| |
| |     Merge branch 'dev'
| |
| * commit 31137606f85d8960fa1640d0881682a081ffa9d0
| | Author: linjie <linjielig@gmail.com>
| | Date:   Mon Mar 14 16:01:26 2016 +0800
| |
| |     commit3
| |
* | commit 79e69240ccd218d49d78a72f33002fd6bc62f407
|/  Author: linjie <linjielig@gmail.com>
|   Date:   Mon Mar 14 16:01:59 2016 +0800
|
|       commit4
|
* commit 7fd4e3fdddb89858d925a89767ec62985ba07f3d
| Author: linjie <linjielig@gmail.com>
| Date:   Mon Mar 14 16:01:00 2016 +0800
|
|     commit2
|
* commit 316dd3fb3c7b501bc9974676adcf558a18508dd4
  Author: linjie <linjielig@gmail.com>
  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

Ви можете бачити commit4 і commit3 - це батько commit5 , commit2 - це батько commit3 і commit4 , commit1 - це батько commit2 .

Дерево хеш:

$ 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

Функція команди: Досить роздрукувати вміст <object>залежно від типу.

git cat-file -p 

У git весь вміст зберігається як об’єкти дерева та blob, з деревами, що відповідають записам каталогу UNIX, та краплі, що відповідають більшій чи меншій кількості входів чи вмісту файлу. Один об’єкт дерева містить одну або декілька записів дерев, кожна з яких містить вказівник SHA-1 на крапку або піддірева з відповідним режимом, типом та назвою файлу. Git зазвичай створює дерево, визначаючи стан вашої області постановки або покажчик і записуючи з нього ряд деревних об’єктів. Об'єкти фіксації містять інформацію про те, хто врятував дерево об'єкта, коли вони зберегли чи чому вони були збережені. Це основна інформація, яку зберігає об’єкт комісії.

Висновок:

Зробіть хеш, Батьківський хеш, Дерево хеш - це все SHA-1. Введіть хеш і батьківський хеш ідентичний, за винятком того, що у батьківського хеша є дитина. Дерево хеша - це об'єкт Дерева. Командний хеш і батьківський хеш являють собою об'єкт фіксації.

Довідка:

  1. Git Internals - об'єкти Git

  2. git-cat-file - надайте інформацію про вміст або тип і розмір для об'єктів сховища


4

Дерево являє собою ієрархічну сукупність файлів і каталогів, а не прив'язані до якоїсь - або конкретній точці в історії. Наприклад, якщо ви створите файл, а потім видалите файл (без жодних інших втручаються комісій), ви отримаєте те саме дерево, з яким ви почали.

Здійснення зобов’язань є моментом в історії вашого проекту. Коміт вказує дерево, але також містить іншу інформацію, таку як автор / фіксатор та час, повідомлення про фіксацію (в якому автор описує, що змінилося), а головне - нульове чи більше батьків, які є попереднім станом сховища. (Ваша перша комісія має нульових батьків. Більшість комісій після цього мають одного з батьків під час лінійної розробки, і більше одного, якщо ви зливаєтеся.)

Ви можете зрозуміти, як це працює з git cat-file -pкомандою, яка друкує вміст певного хеша, незалежно від типу. Наприклад, щоб переглянути команду HEAD, ви можете запустити:

$ git cat-file -p HEAD
tree 81ca1cb660ea79131336944df28b13b711d93557
parent 92b6b8fe9956866ace5397e060e7cc8ee1c76233
parent 7ea2575ed96d150ee19f70edea4bd42c7c2f0b83
author Mislav MarohniÄ <mislav.marohnic@gmail.com> 1436468108 -0700
committer Mislav MarohniÄ <mislav.marohnic@gmail.com> 1436468108 -0700

Merge pull request #951 from github/global-args

Avoid depending on a hardcoded list of git global flags

Щоб побачити дерево всередині комітету, ви можете cat-file -pце дерево:

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

Аналогічно, якщо ви подивитеся на батьків, ви побачите, що це теж коміти. Скорочення для дерева всередині комітету, такого як revє rev^{tree}. Тож попередня команда могла бути написана git cat-file -p HEAD^{tree}. Зверніть увагу, що rev^означає батьківський rev. При наявності декількох батьків, rev^1, rev^2і т.д. Більш детальна інформація доступна в Rev-синтаксичного аналізу сторінки людини мерзотника .


2

"Зробити хеш" - хеш для поточного комітету. Здійснення запису пов'язане з.

"Батьківський хеш" - хеш для будь-яких батьківських гілок, з яких відбувається коміт.

"Хеш дерева" - хеш поточного каталогу у коміті. Хеш дорівнює хешу, який має каталог, якщо його бачити з батьківського каталогу git ls-files --stage --abbrev.

Довідка:


1
що commit hasозначає на початку вашого 3-го абзацу?
Дзен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.