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

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

今日、私はこの記事をオンラインで読んで、いくつかの基本的なGitの知識を学びました。

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

git log --pretty=format:" "この章では、私の好みに応じてログ情報を表示する方法を学びます。

%Hしかし、フォーマットシートでfor Commit Hash%Pfor、Parent Hashおよび%Tforの2つの同様のオプションを見ましたTree Hash

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

私は検索してstackoverflowedしたが、これまでは確かなヒントはありません。

私はこれについて何かを知っていますHash value。それはgitコミットのチェックサムです。

しかし、その役割Parent HashTree hash機能は何ですか?

  • PS:ああ、もう少し考えました。これはParent Hash、支店の直接ソースのハッシュを意味しますか?

ベストアンサー1

親ハッシュ:

$ 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

あなたは見ることができます4つの提出そして3つの提出うん5つの提出2つの提出うん3つの提出そして4つの提出1つの提出うん2つの提出

ツリーハッシュ:

$ 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ディレクトリエントリに対応し、blobはinodeまたはファイルの内容にある程度対応します。 1 つのツリーオブジェクトには 1 つ以上のツリーエントリが含まれ、各エントリには Blob またはサブツリーへの SHA-1 ポインタと関連するスキーマ、タイプ、ファイル名が含まれます。 Gitは通常、ステージング領域またはインデックスの状態を取得し、そこから一連のツリーオブジェクトを作成してツリーを作成します。コミットオブジェクトには、ツリーオブジェクトを保存した人、いつ保存したのか、なぜ保存したのかに関する情報が含まれています。これは、送信オブジェクトが保存する基本情報です。

結論として:

コミットハッシュ、親ハッシュ、ツリーハッシュはすべてSHA-1です。コミットハッシュと親ハッシュは同じですが、親ハッシュに子があることだけが異なります。ツリーハッシュはツリーオブジェクトを表します。コミットハッシュと親ハッシュはコミットオブジェクトを表します。

引用:

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

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

おすすめ記事