Gitの「コミットハッシュ」、「親ハッシュ」、「ツリーハッシュ」の違いは何ですか?


12

今日、私はこのドキュメントをオンラインで読んで、いくつかの基本的なgitの知識を学んでいます:

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

そしてその章でgit log --pretty=format:" "は、自分の好みでログ情報を表示する方法を学び始めました。

しかし、いくつかの方法は、私は、フォーマットテーブル2つの同様のオプションで見てきた%HためにCommit Hash%PためにParent Hash%TのためにTree Hash

私はコマンドラインでそれらを実験しましたが、すべて同じ長さで値が異なるハッシュ値であることがわかりました。

私はグーグルしてスタックオーバーフローしましたが、今のところ明確なヒントはありません。

私はこれについて考えていますHash value、それはそのgit commitのチェックサムです。

しかし、何をし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

あなたが見ることができるcommit4commit3がの親であるcommit5commit2はの親であるcommit3commit4commit1はの親である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ディレクトリエントリに対応し、ブロブはほぼiノードまたはファイルコンテンツに対応します。単一のツリーオブジェクトには、1つ以上のツリーエントリが含まれ、各エントリには、関連するモード、タイプ、およびファイル名を持つBLOBまたはサブツリーへのSHA-1ポインターが含まれます。Gitは通常、ステージング領域またはインデックスの状態を取得し、そこから一連のツリーオブジェクトを書き込むことでツリーを作成します。コミットオブジェクトには、ツリーオブジェクトを誰が保存したか、いつ保存したか、なぜ保存されたのかに関する情報があります。これは、コミットオブジェクトが保存する基本情報です。

結論:

コミットハッシュ、親ハッシュ、ツリーハッシュはすべてSHA-1です。コミットハッシュと親ハッシュは、親ハッシュに子があることを除いて同一です。TreeハッシュはTreeオブジェクトを表します。コミットハッシュと親ハッシュは、コミットオブジェクトを表します。

参照:

  1. Git内部-Gitオブジェクト

  2. git-cat-file-リポジトリオブジェクトのコンテンツまたはタイプとサイズの情報を提供する


4

ツリーは、歴史の中で、特定のポイントに関連付けられていないファイルやディレクトリの階層的なコレクションです。たとえば、ファイルを作成し、後でそのファイルを削除した場合(他のコミットは行われません)、元のツリーと同じになります。

Aはコミットプロジェクトの歴史の中でのポイントです。コミットはツリーを指定しますが、作成者/コミッターと時間、コミットメッセージ(作成者が変更内容を説明する)、最も重要なのはリポジトリの以前の状態であるゼロ以上の親など、他の情報も含みます。(最初のコミットの親はゼロです。その後のほとんどのコミットには、線形開発中に1つの親があり、マージすると複数になります。)

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

同様に、親を見ると、それらもコミットであることがわかります。revis などのコミット内のツリーの略記rev^{tree}。したがって、前のコマンドが記述されている可能性がありますgit cat-file -p HEAD^{tree}。はのrev^親を表すことに注意してくださいrev。複数の親がある場合は、rev^1rev^2、などの詳しい情報はで利用可能ですGitのREV-解析のmanページ


2

「コミットハッシュ」は、現在のコミットのハッシュです。エントリが関連付けられているコミット。

「親ハッシュ」は、コミット元の親ブランチのハッシュです。

「ツリーハッシュ」は、コミットの現在のディレクトリのハッシュです。ハッシュは、で親ディレクトリから見た場合のディレクトリのハッシュと同じgit ls-files --stage --abbrevです。

参照:


1
commit has3番目の段落の冒頭で何を意味しますか?
Zenの
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.