デザイナのためのGit講座
  株式会社ファクトリアル
     末並 晃
Table of Contents
• PART1
  • Abstract of Git
  • ∼わりと真面目なGitのはなし∼
• PART2
  • Inside Git
  • ∼こみっとたんの一生∼
• PART3
  • Tips of Git
  • ∼こんなときどうする?∼
PAER1 Abstract
わりと真面目なGitの話
バージョン管理とは
• バージョン管理システムとは、コンピュータ上で作成、編集され
 るファイルの変更履歴を管理するためのシステム。特にソフト
 ウェア開発においてソースコードの管理に用いられることが多
 い。(出典: Wikipedia)

• SCM(Source Code Management)と呼ばれることもある。
• 「リポジトリ」と呼ばれるファイル管理用のディレクトリをひ
 とつ以上持ち、そこからファイルを「コミット」したり
 「チェックアウト」したりすることにより履歴を更新してい
 く。
Gitの特徴
• 分散バージョン管理
• 40桁のハッシュ値で変更履歴を管理
• 各コミットのファイルツリーをスナップショットで保持
• 履歴管理の柔軟性が高い
 • 一度コミットしたものは参照されなくなってもしばらくは残
  り続ける

 • 過去にさかのぼって履歴を変更することができる
• ファイル名を明示的に管理しない
• ブランチの作成/マージが容易にできる
分散バージョン管理
• リポジトリが複数存在する
• プロジェクトメンバーそれぞれが自分のリポジトリを持つ




  集中バージョン管理                      分散バージョン管理

           出典: http://www.atmarkit.co.jp/fjava/rensai4/devtool03/devtool03_1.html
分散バージョン管理
• 一時作業の履歴管理を柔軟におこなうことができる
• ローカルリポジトリへの操作に関してはネットワーク通信を必
 要としない

 • 高いパフォーマンス

 • オフライン作業
バージョン管理システム比較
• 分散バージョン管理システムはGitの他にMercurialがある
• MercurialはWindowsフレンドリーな部分やコマンド体系がGitよ
  りもSVNに近い

                              リボジョンの
        リポジトリ       ファイル管理              履歴の再編集
                                表現


 SVN   集中リポジトリ      チェンジセット     連番        不可能


                                        すべてのコミット
 Git   分散リポジトリ スナップショット        ハッシュ
                                          で可能

                               連番と      直前のリビジョン
Mercurial 分散リポジトリ   チェンジセット
                              ハッシュの併用    に限り可能
PART1 まとめ
• Gitとは分散バージョン管理システムのひとつ。
• 分散バージョン管理システムは集中バージョン管理システムに比
 べて様々なメリットがある。

 • オフライン作業

 • 高パフォーマンス

 • 柔軟な履歴管理

• Gitにはその他にも様々な特徴があり、耐障害性、履歴管理の柔
 軟性等が評価されている。
PART2 Inside Git
こみっとたんの一生
本スライドの内容はノンフィクションであり、
実在の人物、団体等とは一切関係ありません。

ただし、実在するバージョン管理システムgitの
 内部データ構造を忠実に擬人化したため、
ある意味ではわりとノンフィクションです。
なお、忠実に擬人化することを重視した結果、
  一部えげつない設定になってしまったことを
    この場を借りてお詫び申し上げます。
(例: 近親相姦、大量虐殺、高齢化社会、歴史の捏造)

     登場キャラ「こみっとたん」は
     人間の様相をしておりますが、
  あくまでgitのcommitオブジェクトである旨を
     十分にご理解いただいたうえで
     お聞きいただければ幸いです。
こみっとたん紹介
• 本編の主人公。

• シングルマザー家庭で育っ
 た子が多い。


• かばんを一つ持っている。
 かばん大事。


• 本名は40文字。長い。

• 特技: 分身
ぎっとの世界

      ここは「りぽじとり」っていうぎっとの世界。
      「にんげん」っていう神様が作った世界だよ。
             わたしたちはみんなここに住んでるの



% git init
パラレルワールド
   「にんげん」は世界をまるごと複製できるみたい。
               わたしたちが住んでるこの世界と
  ほとんどまったく同じ世界が別のどこかにもあって、
       「にんげん」が自由に作ることができるの。
 でもわたしたちにはひとりひとり名前がついてるから
       向こうの世界でも自分だってわかるんだよ。

% git clone /path/to/repository.git
こみっとたん誕生

              わたしはおかあさんのかばんを
               守り抜くために生まれるの。
    おかあさんのかばんの中身を少しだけ入れ替えて
              わたしに授けてくれるんだよ。



% git add path/to/modified_file
% git commit -m “commit messsage”
本家と分家
                   わたしたちの世界では
      親ひとりに子ひとりのことが多いんだけど、
         たまに子どもが複数いる場合もあるよ。
                  その複数の子どもたちは
    それぞれ別々の一族として子孫を残していくの。
 その一族をそれぞれを「ぶらんち」って呼ぶみたい。

% git branch branch-name
% git checkout branch-name
% ...edit...
% git commit -a
Column ∼ブランチ∼
• ブランチという名称上、「枝」のようなものを連想することが
 多いが、実体はある特定のコミットに名前をつける行為あるい
 はつけられた名前のこと。

• ただし、そのコミットに子コミットが生成された場合、その子
 コミットに名前がつけられる。
結婚/血筋の統合
                わたしたちはひとりで子どもを
       生むこともできるし、それが多いんだけど、
             ときどき別の一族と結婚もするよ。
         分家が本家に戻ってくることが多いかな。
             両親がいるコミットはめずらしくて
       「まーじこみっと」って呼ばれたりするの。
% git merge branch-name
Updating 5381c40..0235098
Fast-forward
 test.txt | 2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
ご先祖様の反対
       でも、ときどき、その結婚も反対されるの。
                       「誰に?」って?
   わたしたちは元々は同じ一族だから、ずっと                                     ると
                  共通のご先祖様がいるの。
    そのご先祖様が反対したら結婚できないんだよ。
  「にんげん」が出てきて仲裁してくれるんだけどね。

% git merge branch-name
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.
Column ∼マージ戦略∼
• Gitのマージはデフォルトでは「3-wayマージ」というアルゴリ
 ズム(厳密にはその改良版)によっておこなわれる。

• マージ対象のブランチそれぞれの先頭コミットと、両者の共通
 祖先コミットの状態によって以下のようにマージがおこなわれ
 る。

 共通祖先     ブランチ1    ブランチ2     結果

   X        X        X       X

   X        X        Y       Y

   X        Y        X       Y

   X        Y        Y       Y

   X        Y        Z     コンフリクト
世にも恐ろしい家系図変更
                 「にんげん」ってすごい。
         わたしたちのお母さんやご先祖様たちが
   築いてきた歴史を修正することができるんだって。
             わたしがお母さんの親だったり、
  おばあちゃんがおじいちゃんは実は親子だったり。
                           うーん・・・

% git rebase base-commit
あたらしい名前
 わたしたちはみんなこの世界で真面目に生きてるけど
         「にんげん」がわたしたち全員のことを
               認めてくれるわけじゃないの。
         わたしたちの名前って40文字で長いから
           「にんげん」にとって大事なひとには
   「たぐ」っていう呼びやすい名前つけてくれるの。

% git tag tag-name
Column ∼タグ∼
• 特定のコミットに名前をつける行為もしくはつけられた名前の
 こと。

• 40文字のハッシュと本質的には差異はない。
 • すべてのコマンドはコミットのハッシュとタグをまったく区
  別せずに実行可能。

 • 人間にとってわかりやすいかどうかだけ。

• ブランチと違い、子コミットを生成しても名前がつけ変えられ
 ることはなく、恒久的に名付けできる。
再びパラレルワールド
                  わたしが住んでる世界は
        「にんげん」が作ったって話、覚えてる?
          わたしたちはある程度世代を重ねたら
              複製されたもうひとつの世界に
                 移動しないといけないの。
             もちろん、わたしの分身が、ね。

% git push origin branch-name
再びパラレルワールド(悲劇)

   でもときどき向こうの世界のわたしのおかあさんに
         すでに別の子どもがいることがあるの。
そしたら、わたしは向こうの世界で生きていけないから
   お兄ちゃんの子どもになるか、お兄ちゃんと一緒に
         別の子孫を残さないといけないんだよ。

% git fetch origin
% git rebase origin/branch-name
...or...
% git pull
% git pull --rebase
わたしのご先祖様は…

            わたしたちは基本的にとっても長生き。
 何世代も前のご先祖様にだって簡単に会えちゃうの。
            途中で途絶えたように見える一族だって
              見つかりにくいところにいるだけで
              この世界のどこかにいるんだよ。


% git log

% git reflog
大量虐殺
            でもね、長生きなわたしたちでも
     たまに死んじゃうの。しかも一度にたくさん。
なんか数が増えしちゃうとぱふぉーまんすが悪くなって
 「にんげん」にとって都合悪くなっちゃうらしくて。
           だいたい途絶えちゃった一族がそのまま
            生き続けられるのは30日くらい。

% git gc
PART2 まとめ
• Gitにおける主役は「コミット」であり、あらゆるコマンドはコ
 ミットもしくはその集合に対するものである。

• 基本的にコミットを作成してしまえばそれが永遠に失われるこ
 とはほとんどない。(たまにGCされる。)

 • 分散バージョン管理ではローカルリポジトリへの操作は他の
  人に迷惑をかけないのだから、不安なものはできるだけコ
  ミットに残しておくべき。

• あるコマンドが「どのコミットにどういう命令をするのか」と
 いう観点で見ると、少しだけ理解しやすくなるかも。
PART3 Tips of Git
こんなときどうする?
Case1. コンフリクトした!
• コンフリクトしたファイルには以下のような箇所があるはずな
  ので、手動で修正する。

• commitコマンドで手動でコミットする。


1 <<<<<<< HEAD
2 abc1defg
3 =======
4 abcdef2g
5 >>>>>>> feature
Case2. pullしたらなんかエラー
• gitのpullコマンドは内部的にはfetchして、mergeしているだけ。

 • ちなみにfetchしてrebaseするためには--rebaseオプションをつ
   ける。

• そのため、対応方法はCase1の場合と同様。
Case3. Github使うらしい
 • Gitのホスティングをするサービスなので基本的には何も変わり
    はない。

    • むしろ差分を見やすくなったり、画像の差分を見れるように
       なったり、メリットのほうが多い。

 • 複数のリポジトリを使うことになるので、リポジトリを意識で
    きるようになるのは必須かも。

% git remote add upstream git://github.com/git/git.git
% git remote add origin git@github.com:a-suenami/git.git
% git remote
upstream
origin
Case4. こういうコマンドある?
• git cheat sheetを見る。
  • http://ndpsoftware.com/git-cheatsheet.html
まとめ ∼Gitとの付き合い方∼
• Gitは内部構造まで理解して使いこなすことがもしできたら、と
 ても楽しく、様々な可能性のあるツールです。

 • それを少しでもわかってもらうため、今回は擬人化という手
  段を使いました。

• Gitとうまく付き合っていくためには、各コマンドがリポジトリ
 内部にどういう作用をしているかを理解し、できるだけ問題に
 なりそうな事態を早めに回避することに尽きるかと思います。
質疑応答

デザイナのためのGit講座