GitM#1

kana <kana(a)whileimautomaton.net>
http://whileimautomaton.net/

はじめに

初心者時代に一度は遭遇するトラブル(1)

  1. ワーキングディレクトリを元の状態に戻す方法は?
  2. コマンド名からgit resetとgit revertがそれっぽいな
  3. Subversionだとrevertだったしgit revertかな
  4. うーん、つまりこういうことだな?
    $ git revert HEAD
    fatal: Dirty index: cannot revert
  5. 何が何だか わからない

初心者時代に一度は遭遇するトラブル(2)

  1. じゃあgit resetを試そう
  2. うーん、つまりこういうことだな? OK、成功だ
    $ git reset --hard HEAD
  3. へー、こうすればさらに1つ前の状態に戻せるのか
    $ git reset --hard HEAD~1
  4. あれ、git logしたら最後にしたコミットが消えてる
  5. 何が何だか わからない

初心者時代に一度は遭遇するトラブル(3)

  1. 大体revertとかresetとか紛らわしいよ
  2. これ以外にもサブコマンドが多くて混乱する、というかいくつあるんだ?
  3. $ ls /usr/local/apps/git/libexec | wc -l
      138
  4. 何が何だか わからない

解決方法: gitについて体系だてて学ぶ

git's fundamental (1)

gitリポジトリの構成要素

Object database

Blob object

$ git show $BLOB_ID
<?xml version="1.0" encoding="UTF-8"?>
...

Tree object

$ git ls-tree $TREE_ID
100644 blob 8ab9...    Makefile
100644 blob 8f87...    presentation-oldie.xslt
100644 blob 35b6...    presentation.xslt
100644 blob 35bf...    vim-workshop-3.txt
040000 tree 5334...    vim-workshop-3
040000 tree c470...    vimm2
040000 tree 6b23...    vimm3
...

Commit object

$ git show $COMMIT_ID
commit d8be99b42ff319e38c37db748f7cbb58e9bff917
Author: kana <nicht(a)s8.xrea.com>
Date:   Tue Nov 18 14:54:28 2008 +0900

    xslt: Fix the case for h:a with children

...

Tag object

git's fundamental (2)

コミットの系譜

[A]
$ {edit something ...}; git commit -m 'B'
A ---> [B]
$ {edit something ...}; git commit -m 'C'
A ---> B ---> [C]

ブランチとは

A ---> B ---> C ---> [D]
|
'----> P ---> Q ---> R ---> [S]
       |
       '----> [X]

ブランチの実体

$ cat .git/refs/heads/master
d8be99b42ff319e38c37db748f7cbb58e9bff917

例: ブランチの作成

A ---> [B]
      master
$ git branch nagato master
A ---> [B]
      master
      nagato

例: 各ブランチでの開発(1)

A ---> [B]
      master
      nagato
$ git checkout master
$ {edit something ...}; git commit -m 'C'
$ {edit something ...}; git commit -m 'D'
A ---> [B] ---> C ---> [D]
      nagato          master

例: 各ブランチでの開発(2)

A ---> [B] ---> C ---> [D]
      nagato          master
$ git checkout nagato
$ {edit something ...}; git commit -m 'P'
$ {edit something ...}; git commit -m 'Q'
                    master
A ---> B ---> C ---> [D]
       |
       '----> P ---> [Q]
                    nagato

例: ブランチのマージ

                    master
A ---> B ---> C ---> [D]
       |
       '----> P ---> [Q]
                    nagato
$ git checkout master
$ git merge nagato
                           master
A ---> B ---> C ---> D ---> [DQ]
       |                     ^
       '----> P ---> [Q] ----'
                    nagato

git's style

gitの本質

                           master
A ---> B ---> C ---> D ---> [DQ]
       |                     ^
       '----> P ---> [Q] ----'
                    nagato

FAQ: サブコマンドの数が膨大な理由

FAQ: リビジョン番号がない理由

git's magic

gitの最大の特徴

git reset

git reset {commit}

git reset - 例(1)

A ---> B ---> C ---> [D]
$ git reset HEAD~3
[A] ---> B ---> C ---> D

git reset - 例(2)

$ git reset --hard HEAD
$ git checkout -- .

git rebase

git rebase {another-branch} {main-branch}

git rebase - 例(1)

                    master
A ---> B ---> C ---> [D]
       |
       '----> P ---> [Q]
                    nagato
$ git rebase master nagato
                    master
A ---> B ---> C ---> [D]
                      |
                      '----> P' ---> [Q']
                                    nagato

git rebase - 例(2)

A ---> B ---> C
$ git commit -m 'Fix a typo in B'
A ---> B ---> C ---> [D]
$ git rebase -i HEAD~3
pick f7221ef B        pick f7221ef B
pick bd615f4 C  ===>  squash 7726ec4 D
pick 7726ec4 D        pick bd615f4 C
A ---> B  --->  C  ---> D
|
'----> B' ---> [C']

git's parallel development

参考文献

質疑応答