エンジニアたるもの、マニュアル を読み込むべし。そのためには、Git 内部について若干の予備知識が必要。 ただしその深みにはまると、
Git - the stupid content tracker
の意味がよく分かる。
ということで、まずは用語の理解から。
Git オブジェクトのタイプ
-
blob
ファイルの中身を表すオブジェクト -
tree
ディレクトリの中身の一覧とどのファイルがどの blob に対応するかを表すオブジェクト -
commit
ルートツリーおよびすべてのメタデータへのポインタを含むオブジェクト -
tag
特定のコミットへのポインタを含むオブジェクト
(出典:Pro Git - Pro Git 3.1 Git のブランチ機能)
上の図で、commit 直下の blob は、カレントディレクトリ .
と考えると分かり易い。
関連リンク
オブジェクトの指定
全てのオブジェクトには、フラットな構造のリビジョンがある。リビジョンからオブジェクトを指定可能。
-
SHA-1ハッシュ
オブジェクトの内容に応じて算出されるチェックサム。40字もしくは7文字程度の16進数で表す。 -
特定の commit オブジェクトを表すシンボルも使用可能。 HEAD(変更の基準となるコミットの名前)、 ORIG_HEAD(HEAD に対する変更を行う前の HEAD)、 FETCH_HEAD(
git fetch
したリモート・リポジトリのブランチ)、 MERGE_HEAD(git merge
実行時のマージ元のコミット)、 CHERRY_PICK_HEAD(git cherry-pick
実行時のコミット)。
関連リンク
リビジョン指定のバリエーション
-
<refname>
master
、heads/master
、refs/heads/master
など。 -
<refname>@{<date>}
master@{yesterday}
、HEAD@{1 month 2 weeks 3 days 1 hour 1 second ago}
、HEAD@{1979-02-26 18:30:00}
など。 -
<refname>@{<n>}
n だけ前の参照。HEAD@{1}
など。<refname> の省略は現在のブランチ。 -
<rev>^ あるいは <rev>^<n>
<rev> から見て、commit オブジェクトを親→兄弟へと世代順・生成順にたどる場合の1番目、あるいは_n_番目のオブジェクト。HEAD^
はHEAD^1
と同じ。 -
<rev>~<n>
<rev> から見て、commit オブジェクトを直系の親だけをたどった場合の_n_番目の親。 -
<rev>{<type>}
指定リビジョンから参照できるオブジェクト。HEAD^{tree}
、v0.9^{commit}
など。type を省略すると? -
<rev>{/<text>}
指定リビジョンからさかのぼり、commit メッセージに正規表現 text を含む最初のオブジェクトを参照する。 -
:/<text>
commit メッセージに正規表現 text を含む最初のオブジェクトを表示。:/!
で続けて検索。 -
<rev>:<path>
指定リビジョンの blob(ファイル)あるいは tree(ディレクトリ)を参照する。HEAD:README
、master:./README
など。
とってもバカげた(stupid な)リビジョンの指定
G H I J
\ / \ /
D E F
\ | / \
\ | / |
\|/ |
B C
\ /
\ /
A
A = = A^0
B = A^ = A^1 = A~1
C = A^2 = A^2
D = A^^ = A^1^1 = A~2
E = B^2 = A^^2
F = B^3 = A^^3
G = A^^^ = A^1^1^1 = A~3
H = D^2 = B^^2 = A^^^2 = A~2^2
I = F^ = B^3^ = A^^3^
J = F^2 = B^3^2 = A^^3^2
関連リンク
識別子の用語
-
<object>
あらゆるタイプのオブジェクトの名前を表す。 -
<blob>
blob(ファイル)オブジェクトの名前を表す。 -
<tree>
tree(ディレクトリ)オブジェクトの名前を表す。 -
<commit>
commit オブジェクトの名前を表す。 -
<tree-ish>
tree、commit あるいは tag オブジェクトの名前を表す。 -
<commit-ish>
commit あるいは tag オブジェクトの名前を表す。 -
<type>
オブジェクトのタイプ。blob
、tree
、commit
あるいはtag
。 -
<file>、<path>
ファイル名。 -
<tag>
有効な tab 名。即ちrefs/tags/<tag>
。 -
<head>
有効な head 名。即ちrefs/heads/<head>
。 -
HEAD
現在のブランチの head。
関連リンク
Git コマンドのオプション指定
-
一文字系:
-a
とか-h
とか。 -
単語系:
--all
とか--help
とか。 -
ファイル名の指定:
--
以降に指定することで、直前のオプション引数と区別する。
Git の内部
内部の実例を見ると、イメージがわき易いかも。
Git のファイル構成
$ tree -F .git
.git/
├── COMMIT_EDITMSG
├── FETCH_HEAD
├── HEAD
├── ORIG_HEAD
├── branches/
├── config
├── description
├── hooks/
│ ├── applypatch-msg.sample*
│ ├── commit-msg.sample*
│ ├── post-update.sample*
│ ├── pre-applypatch.sample*
│ ├── pre-commit.sample*
│ ├── pre-rebase.sample*
│ ├── prepare-commit-msg.sample*
│ └── update.sample*
├── index
├── info/
│ └── exclude
├── logs/
│ ├── HEAD
│ └── refs/
│ ├── heads/
│ │ ├── gh-pages
│ │ └── master
│ └── remotes/
│ └── origin/
│ └── gh-pages
└── refs/
├── heads/
│ ├── gh-pages
│ └── master
├── remotes/
│ └── origin/
│ ├── HEAD
│ └── gh-pages
└── tags/
└── v1.0.1
refs 内のオブジェクト
$ git show-ref
0acbba3b5bd52b9e169077a997bcf5d5f37faa96 refs/heads/gh-pages
8403eb93d7e03ca02275d4027d9deadc51dfe37f refs/heads/master
8403eb93d7e03ca02275d4027d9deadc51dfe37f refs/remotes/origin/HEAD
0acbba3b5bd52b9e169077a997bcf5d5f37faa96 refs/remotes/origin/gh-pages
8403eb93d7e03ca02275d4027d9deadc51dfe37f refs/remotes/origin/master
934f4f895321735829e4d8339c5963f54327bcc1 refs/tags/v1.0.0
d43e1ccc84a3930597d50c0f8e6da614c0d05a5a refs/tags/v1.0.1
ステージされてるオブジェクト
$ git cat-file -p HEAD^{tree}
040000 tree 67036e7bea736aa461bf7e737b74925db941999f PIE-1.0beta5
100644 blob 91b43a3e6572f2ffbe3b1d777d04104a976be686 README.md
040000 tree 8041e8916721cbe67da22fb03d668a8e2976d22a css
040000 tree 3857137c4df661ac2b60461ff6ec7e393b54c638 google-code-prettify
100755 blob 49b085dd91dfafe28507007e8eb4bac44b20080c index.html
040000 tree 436ea11960214eac6f68c3b0f935a078903d7062 js