今日、私はこの記事をオンラインで読んで、いくつかの基本的なGitの知識を学びました。
http://git-scm.com/book/en/v2/Git-Basics-Viewing-the-Commit-Hi
git log --pretty=format:" "
この章では、私の好みに応じてログ情報を表示する方法を学びます。
%H
しかし、フォーマットシートでfor Commit Hash
、%P
for、Parent Hash
および%T
forの2つの同様のオプションを見ましたTree Hash
。
コマンドラインで実験した結果、長さはすべて同じですが、値が異なるハッシュであることがわかりました。
私は検索してstackoverflowedしたが、これまでは確かなヒントはありません。
私はこれについて何かを知っていますHash value
。それはgitコミットのチェックサムです。
しかし、その役割Parent Hash
とTree 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です。コミットハッシュと親ハッシュは同じですが、親ハッシュに子があることだけが異なります。ツリーハッシュはツリーオブジェクトを表します。コミットハッシュと親ハッシュはコミットオブジェクトを表します。
引用:
答え2
ㅏ木履歴の特定のポイントに関連付けられていないファイルとディレクトリの階層的なコレクション。たとえば、ファイルを作成して削除すると(他の中間コミットなしで)、起動したときと同じツリーが生成されます。
ㅏ犯罪プロジェクト記録の一点です。コミットはツリーを指定しますが、作成者/コミッタと時間、コミットメッセージ(作成者が変更した内容を説明する場所)、最も重要なことは、リポジトリの以前の状態であるゼロ以上の親などの他の情報も含みます。 (最初のコミットには親がありません。それ以降、ほとんどのコミットには線形開発中に親が1つあるか、マージする場合は複数の親があります。)
git cat-file -p
タイプに関係なく、特定のハッシュの内容を印刷するこのコマンドを使用すると、どのように機能するかを確認できます。たとえば、HEADコミットを表示するには、次のようにします。
$ 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
そのコミット内のツリーを表示するには、cat-file -p
そのツリーを表示します。
$ git cat-file -p 81ca1cb660ea79131336944df28b13b711d93557
100644 blob 730f77a3be502cfe6769c1305c0b59c22274caf5 .gitignore
100644 blob bcbd000f6b9ad5b0510f804ac4a3b19306b39c03 .travis.yml
100644 blob da71aa1fa3c3ae47b2fe5e6245ce2eea1586e278 CONTRIBUTING.md
...
繰り返しますが、親を見ると、これがコミットであることがわかります。rev
is などのコミット内部ツリーの略語ですrev^{tree}
。したがって、前のコマンドを作成できますgit cat-file -p HEAD^{tree}
。rev^
デリゲートの親rev
。親が複数ある場合など、rev^1
詳細rev^2
は以下から確認できます。git rev-parse のマニュアルページ。
答え3
「CommitHash」は現在のコミットのハッシュです。項目に関連するコミットです。
「親ハッシュ」は、コミットが発生した親ブランチのハッシュです。
「ツリーハッシュ」は、コミット内の現在のディレクトリのハッシュです。このハッシュは、を使用して親ディレクトリから見た場合、ディレクトリのハッシュと同じですgit ls-files --stage --abbrev
。
引用: