Git overview Version 0.96 This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. Tatsuki Sugiura <[email protected]>
Git overview
Version 0.96
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Tatsuki Sugiura <[email protected]>
2
Agenda
● バージョン管理システムってどういうもの?● git のモデルとローカル操作● git でのリモート連携● 参考資料など
3
git とは...
● 発音は [ ít] (ɡ ぎっと)
● Linus Tovals が Linux kernel のために作成したバージョンコントロールシステム
● Linux kernel 以外でも幅広く使われるように (xorg, rails, wine, cairo...)
● コミットツリーのモデルを素直に実装● ハッシュをキーにしたオブジェクトDB
● 中央サーバに依存しない分散モデル (分散レポジトリ)
● 十分な機能性 (このスライドでは説明しません)
– きわめて高速– 強力なマージ機構とマージの履歴情報– 差分圧縮によるストレージの効率化
4
バージョン管理システム (VCS)
● 動機– 修正を世代ごとに取っておきたい– 修正の履歴を簡単にみたい– 修正差分の確認を簡単にしたい
● 有名なオープンソースツール– RCS, CVS, Subversion (svn), bazzar (bzr), mercurial (hg),
git (new!)
● SCM (Software Configuration Management) ツールと呼ばれたりも
5
VCS/SCMでよく使われる用語● リポジトリ
– 全ての履歴データを保存している場所
● チェックアウト– リポジトリからデータを取り出す
● コミット/チェックイン– リポジトリに修正した内容を書きこむ
● 作業ツリー/作業コピー– 実際の編集作業を行う為にファイルを展開した場所
● ブランチ– 修正の流れを分岐する仕組み
● マージ– 並行して行われた複数の修正を併合すること
● コンフリクト– マージの際、修正内容が競合すること (同じ箇所に別の修正を行う、など)
6
概念的ワークフロー
● 最初にレポジトリから作業用ディレクトリ(作業ツリー)にファイルを展開 = チェックアウト
● 作業ツリーを変更● 変更点をレポジトリに書き戻す = チェックイン● 問題が起きたら
– 単純に古いバージョンをチェックアウトして差し戻す– 最近の修正差分をみて、問題点を発見 → 修正
7
git local
(ローカル編)
8
git のモデル(1) - コミットツリー
● メインのデータ構造● コミットの親子関係を示す
● git を使う上で最重要要素! 常にツリーの状態を把握しよう
XXサイト、最初のバージョン
タイトル画像を追加
イベント情報を追加
タイトルを冬バージョンへ
冬のイベントを追加
日付が間違っていたのを修正
9
(余談)「ツリー」とは言うけど
● 実際には片方向有向グラフ– ルートノードは複数存在することがある
– 各ノードは1つ以上の親への参照を持つ(ルート以外)
10
git のモデル(2) - オブジェクトDB
● SHA1 Digetst をキーにした Key-Value ストレージ● 実体はレポジトリトップの .git の下に存在する● 主なオブジェクトタイプ
– commit: コミットメッセージとメタ情報– tree: ディレクトリ– blob: ファイルの実体
● Blob はバイナリそのまま、それ以外は RFC822 風(?)の形式で表したテキストのダイジェストを取るだけ
11
オブジェクトの関連
commit
commit
commit
tree
blob
blob
tree
tree
tree
blob
blob
blob
blob
blob
12
実際の例: commit オブジェクト
tree 298e00bf81e1cb8f185bb0f3f3a7e36c4fe6de1eparent b94712703db282e8e227df510997c19ae0843f50author Alex Dunae <[email protected]> 1289601832 -0800committer Alex Dunae <[email protected]> 1289601832 -0800
Update install instructions
c7e7f0fe36798ebfbad51f73988e9ec1ceba30d8
da7f4396d920a5a61039da6a28486caf6705474d
b94712703db282e8e227df510997c19ae0843f50
Proper timezone handling without needing activesupport
Update install instructions
CA: Remembrance Day typo -- closes GH-4
13
実際の例: tree オブジェクトtree 298e00bf81e1cb8f185bb0f3f3a7e36c4fe6de1eparent b94712703db282e8e227df510997c19ae0843f50author Alex Dunae <[email protected]> 1289601832 -0800committer Alex Dunae <[email protected]> 1289601832 -0800
Update install instructions
100644 blob 39272ef0e0f5a05647812a57cebd1b3644770105 .gitignore100644 blob 01c496d464df1deddb853119e8b61777e5703a67 CHANGELOG100644 blob c5834ab3f785778b6ddd221c806ab1a3ba2045f7 LICENSE100644 blob ec0cdcc95d268d7a9a8702263db25166ec69c052 README.rdoc100644 blob 715efbe1e1832ea19b4fa8c302e1ac53a6b61069 REFERENCES040000 tree 504df98c21286faaa64e5cb0f5d712b14d85ae08 data100644 blob 34327c0c81423708c4ee818cbfd71df916e3441e holidays.gemspec040000 tree c1cf84305ab68f2150ae5588fdb33288f6a68de4 lib100644 blob 618f85767bf69a20f380f50320fdf63955eec1ce rakefile.rb040000 tree 0ba469d863ceccc2ecf5c7474be59e85a6c6e647 test
14
実際の例: blob オブジェクト100644 blob 39272ef0e0f5a05647812a57cebd1b3644770105 .gitignore100644 blob 01c496d464df1deddb853119e8b61777e5703a67 CHANGELOG100644 blob c5834ab3f785778b6ddd221c806ab1a3ba2045f7 LICENSE100644 blob ec0cdcc95d268d7a9a8702263db25166ec69c052 README.rdoc...
= Ruby Holidays Gem A set of functions to deal with holidays in Ruby. Extends Ruby's built-in Date class and supports custom holiday definition lists. === Installation To install the gem from RubyGems: gem install holidays === Examples
15
git のモデル(3) - リファレンス
● ブランチ、タグなどオブジェクトではない参照ラベル
● 任意の名前を持ち、通常は commit の SHA1 を指している
16
ブランチとタグ● 一つのコミットのSHA1を指しているラベル
● ブランチはコミットが進むと移動していく
● タグは移動しない● このスライドでは説明しないけど注意:ラベルではない annotated tag というのもある (DB にオブジェクトとして記録される)
master
experimental
release_01
db-tune
release_02
17
HEAD
● 現在チェックアウトしているブランチを指すポインタ
● 操作対象を省略した場合はたいてい自動的に HEAD (もしくは HEAD がさしているブランチ) を対象にする
● コミットのSHA1を直接指すこともできる (例外的な使い方)
master
experimental
release_01
db-tune
release_02
HEAD
18
git コマンド
● レポジトリに cd して、git <サブコマンド>
● 今から使うサブコマンド– init: レポジトリ初期化– add: ファイルをコミット予定(index)に追加– commit: 実際のコミットを行う– branch: ブランチの一覧、作成、削除– checkout: 指定したブランチをチェックアウトし作業ツリーを更新
19
git の具体的な作業の流れの例● レポジトリを作る
–git init● コミット予定に追加する
–git add● コミット
– git commit● 別作業をするためにブランチを作成
– git branch●新しいブランチに切り替える
–git checkout● 修正してコミット
– git commit -av●元のブランチに戻る
– git checkout
20
実際の例とレポジトリの動き (1)
● レポジトリを作る
● ファイルを作って add
● commit
$ mkdir try-git$ cd try-git$ git init
$ date > date.txt$ git add date.txt
$ git commit -v -m 'First commit' First commit
master
HEAD
21
実際の例とレポジトリの動き (2)
● ファイルを変更する
● git add で変更したファイルをステージ(indexに登録)する
● commit
$ date > date.txt
First commit
(working copy)
master
$ git add date.txt
HEAD
First commit
(index)
masterHEAD
(working copy)
$ git comit -v -m 'Update data.txt'First commit
master
HEAD Update date.txt
22
実際の例とレポジトリの動き (3)
● ブランチを作る
● ブランチに移動
● ブランチでコミット
$ git branch ns-stamp
First commit
master HEAD
Update date.txtns-stamp
$ git checkout ns-stamp
First commit
masterHEAD
Update date.txtns-stamp
$ date “+%s.%N” > stamp$ git add stamp$ git commit -m 'Add ns stamp'
First commit
master
HEAD Update date.txt
ns-stamp Add ns stamp
23
実際の例とレポジトリの動き (4)
● master ブランチに戻る
● コミット
First commit
master
HEAD
Update date.txtns-stamp
Add ns stamp
(Working copy)
First commit
master
HEAD
Update date.txt
Add ns stamp
Update date, again
$ git checkout master
$ date > date.txt$ git comit -av -m 'Update date, again.'
ns-stamp
24
実際の例とレポジトリの動き (5)
● ns-stamp ブランチをマージ
First commit
master
HEAD
Update date.txtns-stamp
Add ns stamp
Update date, again
$ git merge ns-stamp
Merge branch 'ns-stamp'
25
ブランチ(ラベル)は重要
● ブランチのついていないコミットの枝は見えなくなる(そしてそのうちgcで回収される)
● マージや複数のレポジトリ連携でもブランチを使って操作する
● 常にツリーの状態を意識(チェック)しよう– gitk --all
– git log --graph
26
git log --graph
27
gitk --all
28
git remote
(リモート編)
29
Git の分散レポジトリ● 各人がそれぞれ、(完全な)レポジトリと作業ツリーのセットを持つ
● システム的には中央は存在しない– でも概念的には作ってもいい– 実際のプロジェクト運営では作成する事が多い– その場合は作業ツリーを持たない特殊(bare)なレポジトリを作るといい
● 組織、運用に合わせて好きなように構成可能● レポジトリ間で足らないオブジェクトを送り合う● 作業ツリーへの操作や反映は、各々で行う
30
自分のレポジトリと作業ツリーの間で作業
ReposWT
Alice
Checkout
Commit ReposWT
Rob
Checkout
Commit
31
それぞれのレポジトリ間でやりとり
ReposWT
Alice
ReposWT
Rob
ReposWT
Joe
32
中央にレポジトリを置く運用
ReposWT
Alice
ReposWT
Joe
ReposWT
Rob
Bare Repository
Repos
33
それぞれが公開用レポジトリを持つ場合
ReposWT
Alice
ReposWT
Joe
ReposWT
Rob
Rob's public repo
Repos
Alice's public repo
Repos
Joe's public repo
Repos
34
マージ(pull)機構付きの特殊な公開レポジトリ(githubなど)
ReposWT
Alice
ReposWT
Joe
ReposWT
Rob
Rob's public repo
Repos
Alice's public repo
Repos
Joe's public repo
Repos
35
リモートレポジトリ連携● 単にお互いを比較して、存在しないオブジェクトを交換する● 操作
– clone: レポジトリをコピーして新たなレポジトリを作成– fetch: 相手のレポジトリから自分に無い部分を取得– push: 自分のレポジトリから相手にオブジェクトを書き込み、相手のブランチラベルを移動させる
– pull: fetch + merge
● 外部レポジトリURLを名前(ラベル)を付けて管理– 例: (URL=) http://github.com/sugi/btr-backup.git => (ラベル) github
– 標準の参照先(clone元)はディフォルトでは origin と言う名前
36
リモートブランチ● 外部レポジトリとの連携のキモ● 相手の持っているブランチが、単純に“リモートレポジトリ名/ブランチ名”と言う名前のブランチに見える– "sfjp" という名前の付けられたリモート URL
https://scm.users.sourceforge.jp/gitroot/sugi/try1 上の"dev" ブランチ → "sfjp/dev" (もしくは remotes/sfjp/dev)
● リモートブランチはラベルを直接動かせない (チェックアウトした場合、HEAD はブランチではなくコミットを直接指す)
● コミットを追加する(その枝を伸ばす)時はリモートブランチを元にローカルブランチを作る– 直接 push するならリモートと同名のブランチを作るとよい
● 例: git checkout -b dev origin/dev
37
実際の操作: リモート編 (1)
● リモートから clone
$ git clone host2.example.com:git/try
First commit
Add README.txt
origin
master
autoupdate
Makefie automation
First commit
Add README.txtmaster
Makefie automationHEAD
origin/master
origin/autoupdateclone
HEAD
38
実際の操作: リモート編 (2)
● ローカルの master ブランチを変更$ git commit -av -m 'Fix typo'
First commit
Add README.txt
origin
master
autoupdate
Makefie automation
First commit
Add README.txt
master
Makefie automationHEAD
origin/master
origin/autoupdate
HEAD
Fix typo
39
実際の操作: リモート編 (3)
● origin に push
$ git push
First commit
Add README.txt
origin
master
autoupdateMakefie automation
First commit
Add README.txt
master
Makefie automation
HEAD
origin/master
origin/autoupdate
HEAD
Fix typo Fix typo
push
40
実際の操作: リモート編 (4)
● リモートブランチを元にローカルブランチを作成し、そこにカレントブランチを移動
$ git checkout -b autoupdate origin/autoupdate
First commit
Add README.txt
origin
master
autoupdateMakefie automation
First commit
Add README.txt
master
Makefie automation
HEAD
origin/master
origin/autoupdateHEAD
Fix typo Fix typo
autoupdate
41
実際の操作: リモート編 (5)
● ローカルでバグフィクスしてmasterにマージ$ git commit -av -m 'Fix automation bug'$ git checkout master$ git merge autoupdate
First commit
Add README.txt
origin
master
autoupdateMakefie automation
First commit
Add README.txt
master
Makefie automation
HEAD
origin/master
origin/autoupdate
HEAD
Fix typo Fix typo
autoupdate
Fix automation bug
merge autoupdate
42
実際の操作: リモート編 (6)
● リモートの master が誰かに更新された
First commit
Add README.txt
origin
master
autoupdateMakefie automation
First commit
Add README.txt
master
Makefie automation
HEAD
origin/master
origin/autoupdate
HEAD
Fix typo Fix typo
autoupdate
Fix automation bug
merge autoupdate
Add License file
43
実際の操作: リモート編 (7)
● origin を pull (の fetch 部分の様子)
First commit
Add README.txt
origin
master
autoupdateMakefie automation
First commitAdd README.txt
master
Makefie automation
HEAD
origin/master
origin/autoupdate
HEAD
Fix typoFix typo
autoupdate
Fix automation bug
merge autoupdate
Add License file
$ git pull
pull(fetch)Add License file
44
実際の操作: リモート編 (8)
● origin を pull (の merge 部分)
First commit
Add README.txt
origin
master
autoupdateMakefie automation
First commitAdd README.txt
master
Makefie automation
HEAD
origin/master
origin/autoupdate
HEAD
Fix typoFix typo
autoupdate
Fix automation bug
merge autoupdate
Add License file
$ git pull
Add License file
merge origin/master
45
実際の操作: リモート編 (9)
● origin に変更をふたたび push
origin
master
First commitAdd README.txt
master
Makefie automation
HEADorigin/master
origin/autoupdate
HEAD
Fix typo
autoupdate
Fix automation bug
merge autoupdate
$ git push
Add License file
merge origin/master
push
First commitAdd README.txt
Makefie automation
Fix typo
Fix automation bug
merge autoupdate
Add License file
merge origin/master
autoupdate
46
Pushの補足と注意● 基本的に push する前に pull すること!
● 標準では HEAD の指しているブランチだけが相手に送られ、同名のリモートブランチラベルを移動する– 送るブランチ、動かすブランチの都度指定は可能。設定変更して標準で送る物を変更することもできる
– push によって相手に新しいブランチを作成する事もできる (空のレポジトリに push する場合は指定が必須)
● Push 先が作業ツリーを持っている場合(bare でない場合)、標準では相手の HEAD のさしているブランチは動かせない
● 相手のブランチを動かすには、"FastForward" である必要がある– FastForward = 前方向に動かすだけで新しい位置に行けること– マージの場合は、ちゃんとツリー上で繋がっている必要がある (手で同じ修正を入れた場合はFast Forward にならない)
● 最初は相互に pull だけ使ったほうがわかりやすい
47
レポジトリ間連携プロトコル● アクセスプロトコルは色々
– ローカルファイルシステム (fsのアクセスコントロールに従う)
– git オリジナルプロトコル (認証がないので基本 read-only)
– ssh (ログイン先のアクセスコントロールに従う)
– HTTP(S) (プロトコル2種類: smart, dumb. R/W 可)
● git URL の例– (LocalFS) /home/sugi/works/git/try1
– (ssh) host2:works/git/try1 [email protected]:/gitroot/try1
– (git) git://host2.example.com/gitroot/try1
– (HTTP) https://scm.users.sourceforge.jp/gitroot/sugi/try1
48
git refs
(参考と補足)
49
鉄板の参考書籍: 入門Git
● 秀和システム ISBN:978-4798023809
● 現在の Git の開発者/プロジェクトリーダ/メンテナである 濱野純 氏が書いた書籍
● 題名と違い、ぜんぜん入門だけじゃない● 設計理念から内部構造、具体的な操作と例、Tips、コミュニティまですべて詰まってます
50
参考文書
● man 7 gittutorial (日本語訳)http://www8.atwiki.jp/git_jp/pub/git-manual-jp/Documentation/gittutorial.html
● サルでもわかるGit入門http://www.backlog.jp/git-guide/
● A successful Git branching model (日本語訳)http://keijinsonyaban.blogspot.jp/2010/10/successful-git-branching-model.html
● Pro Githttp://www8.atwiki.jp/git_jp/pub/git-manual-jp/Documentation/gittutorial.html
● Git Cheat Sheethttps://na1.salesforce.com/help/doc/en/salesforce_git_developer_cheatsheet.pdf
51
設定など● git config --global user.name "名前"
git config --global user.email メールアドレス– この2つは必ず設定しておこう
● git config --global color.ui auto
– これを設定しておくと、各種出力が色つきになって見やすい● git config --global alias.st status
git config --global alias.co checkout
– よく使うコマンドは省略形のエイリアスを作っておくと楽になる
52
覚えておくと便利なサブコマンド等● reset: HEAD と HEAD が指しているブランチラベルを好きな場所に移動する– --hard を付けると作業ツリーも更新する– git reset --hard だけなら現在の作業ツリーをリセット
● gui: tk 版 gui を起動する。Index の状態を表示/操作するには便利● mergetool: 衝突時に gui のマージツール (meld, qdiff3 など) を起動してマージを行う。エディタで編集するよりこちらの方が楽な場合も多い
● revert: 指定したコミットを反転したコミットを作成し、修正を打ち消す
● commit には必ず -v をつけよう。ログ編集時に Diff が確認できる
53
Git のホスティングサービス
● SourceForge.JP● github.com● Google Code● SourceForget.net● repo.or.cz
● 他にも海外にはたくさん