サーチ…
レポ
git repositoryは、一連のファイルとディレクトリのメタデータを格納するディスク上のデータ構造です。
プロジェクトの.git/フォルダにあります。 gitにデータをコミットするたびに、ここに格納されます。逆に、 .git/はすべての単一コミットを含みます。
基本的な構造は次のようなものです:
.git/
objects/
refs/
オブジェクト
gitは基本的にキーバリューストアです。あなたがにデータを追加する場合git 、それが構築しobjectとのSHA-1ハッシュ使用してobjectのキーとしての内容を。
そのため、 gitコンテンツはすべてハッシュで参照できます:
git cat-file -p 4bb6f98
Objectは4つのタイプがあります:
-
blob -
tree -
commit -
tag
HEAD ref
HEADは特別なrefです。常に現在のオブジェクトを指します。
.git/HEADファイルをチェックすることで、現在どこが指しているかを確認できます。
通常、 HEADは別のref :
$cat .git/HEAD
ref: refs/heads/mainline
しかし、 object直接指すこともできobject :
$ cat .git/HEAD
4bb6f98a223abc9345a0cef9200562333
これは、「分離頭部」として知られているものです。なぜなら、 HEADは任意のrefにアタッチされるのではなく、 object直接指すからです。
参照
refは本質的にポインタです。これは、 objectを指す名前です。例えば、
"master" --> 1a410e...
それらは `.git / refs / heads /にプレーンテキストファイルとして保存されます。
$ cat .git/refs/heads/mainline
4bb6f98a223abc9345a0cef9200562333
これは一般にbranchesと呼ばれるものです。ただし、中にいることに注意しましょうgitようなものはありませんbranchのみ- ref 。
さて、純粋にハッシュで別のobjectsジャンプすることによってgitをナビゲートすることは可能です。しかし、これは非常に不便です。 refはobjectsを参照するための便利な名前です。 gitにハッシュではなく名前で特定の場所に行くように要求する方がはるかに簡単です。
コミットオブジェクト
commitはgit commitコマンドで作成するのと同じように、おそらくgitユーザにとって最もよく知られているobject型です。
ただし、 commitは変更されたファイルやデータは直接含まれません。むしろ、ほとんどの場合メタデータと、 commit実際の内容を含む他のobjectsへのポインタが含まれています。
commitにはいくつかの要素があります。
-
treeハッシュ - 親
commitハッシュ - 著者名/電子メール、コミッター名/電子メール
- コミットメッセージ
次のようなコミットの内容を見ることができます:
$ git cat-file commit 5bac93
tree 04d1daef...
parent b7850ef5...
author Geddy Lee <[email protected]>
commiter Neil Peart <[email protected]>
First commit!
木
非常に重要な注意点は、 treeオブジェクトはプロジェクト内のすべてのファイルを保存し、差分ファイルではないファイル全体を保存することです。つまり、各commitはプロジェクト全体のスナップショット*が含まれています。
* 技術的には、変更されたファイルのみが保存されます。しかし、これは効率化のための実装の詳細です。設計の観点から、 commitはプロジェクトの完全なコピーを含むものとみなされるべきです。
親
parent行には、別のcommitオブジェクトのハッシュが含まれており、「前回のコミット」を指す「親ポインタ」と考えることができます。これは暗黙的にコミット・グラフと呼ばれるコミットのグラフを形成します 。具体的には、それは有向非循環グラフ (またはDAG)です。
ツリーオブジェクト
tree基本的に従来のファイルシステムのフォルダを表します。ファイルやその他のフォルダのネストされたコンテナです。
tree含まれるもの:
- 0以上の
blobオブジェクト - 0個以上の
treeオブジェクト
lsまたはdirを使用してフォルダの内容を一覧表示するのと同じように、 treeオブジェクトの内容を一覧表示できます。
$ git cat-file -p 07b1a631
100644 blob b91bba1b .gitignore
100644 blob cc0956f1 Makefile
040000 tree 92e1ca7e src
...
あなたは内のファイルを検索することができますcommit最初のハッシュ見つけることによってtreeしてcommitているを見て、その後、およびtree :
$ git cat-file commit 4bb6f93a
tree 07b1a631
parent ...
author ...
commiter ...
$ git cat-file -p 07b1a631
100644 blob b91bba1b .gitignore
100644 blob cc0956f1 Makefile
040000 tree 92e1ca7e src
...
Blobオブジェクト
blobは、任意のバイナリファイルの内容が含まれます。一般的に、ソースコードやブログ記事などの生のテキストになります。しかし、それはPNGファイルなどのバイトと同じくらい簡単にできます。
blobのハッシュがあれば、その内容を見ることができます。
$ git cat-file -p d429810
package com.example.project
class Foo {
...
}
...
たとえば、上記のようにtreeをブラウズし、その中のblobs 1つを見ることができます。
$ git cat-file -p 07b1a631
100644 blob b91bba1b .gitignore
100644 blob cc0956f1 Makefile
040000 tree 92e1ca7e src
100644 blob cae391ff Readme.txt
$ git cat-file -p cae391ff
Welcome to my project! This is the readmefile
...
新しいコミットの作成
git commitコマンドはいくつかのことを行います:
-
.git/objects格納されたプロジェクトディレクトリを表すためのblobsとtreesを作成.git/objects - 作成者情報、コミットメッセージ、およびステップ1からのルート
treeを含む新しいcommitオブジェクトを作成します。これも.git/objects格納され.git/objects -
.git/HEADHEADrefを新しく作成されたcommitハッシュに更新commit
これにより、プロジェクトの新しいスナップショットがgitに追加され、以前の状態に接続されます。
ムービングヘッド
あなたが実行すると、 git checkout (ハッシュまたはREFによって指定された)コミットであなたが言っているgit作業ディレクトリを作成するスナップショットが取られたとき、それがなかったかのように見えます。
-
commit内部のtreeと一致するように作業ディレクトリ内のファイルを更新commit - 特定のハッシュまたは参照を指すように
HEADを更新する
参考文献の移動
git reset --hard実行すると、指定したハッシュ/ refに参照が移動します。
MyBranchをb8dc53移動する:
$ git checkout MyBranch # moves HEAD to MyBranch
$ git reset --hard b8dc53 # makes MyBranch point to b8dc53
新しいRefsの作成
git checkout -b <refname>をcommitと、現在のcommitを指す新しいrefが作成されます。
$ cat .git/head
1f324a
$ git checkout -b TestBranch
$ cat .git/refs/heads/TestBranch
1f324a