T.I.D.

Git や GitHub と戯れる、オレオレ的おとなの遊び場

Git英文マニュアルを読むための予備知識

エンジニアたるもの、マニュアル を読み込むべし。そのためには、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>
    masterheads/masterrefs/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:READMEmaster:./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>
    オブジェクトのタイプ。blobtreecommit あるいは 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

関連リンク

日本語リソース

Comments