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