サーチ…
レポ
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/HEAD
HEAD
refを新しく作成された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