Git overview (v 0.96)

53
Git overview Version 0.96 This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. Tatsuki Sugiura <[email protected]>

Transcript of Git overview (v 0.96)

Page 1: Git overview (v 0.96)

Git overview

Version 0.96

This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

Tatsuki Sugiura <[email protected]>

Page 2: Git overview (v 0.96)

2

Agenda

● バージョン管理システムってどういうもの?● git のモデルとローカル操作● git でのリモート連携● 参考資料など

Page 3: Git overview (v 0.96)

3

git とは...

● 発音は [ ít] (ɡ ぎっと)

● Linus Tovals が Linux kernel のために作成したバージョンコントロールシステム

● Linux kernel 以外でも幅広く使われるように (xorg, rails, wine, cairo...)

● コミットツリーのモデルを素直に実装● ハッシュをキーにしたオブジェクトDB

● 中央サーバに依存しない分散モデル (分散レポジトリ)

● 十分な機能性 (このスライドでは説明しません)

– きわめて高速– 強力なマージ機構とマージの履歴情報– 差分圧縮によるストレージの効率化

Page 4: Git overview (v 0.96)

4

バージョン管理システム (VCS)

● 動機– 修正を世代ごとに取っておきたい– 修正の履歴を簡単にみたい– 修正差分の確認を簡単にしたい

● 有名なオープンソースツール– RCS, CVS, Subversion (svn), bazzar (bzr), mercurial (hg),

git (new!)

● SCM (Software Configuration Management) ツールと呼ばれたりも

Page 5: Git overview (v 0.96)

5

VCS/SCMでよく使われる用語● リポジトリ

– 全ての履歴データを保存している場所

● チェックアウト– リポジトリからデータを取り出す

● コミット/チェックイン– リポジトリに修正した内容を書きこむ

● 作業ツリー/作業コピー– 実際の編集作業を行う為にファイルを展開した場所

● ブランチ– 修正の流れを分岐する仕組み

● マージ– 並行して行われた複数の修正を併合すること

● コンフリクト– マージの際、修正内容が競合すること (同じ箇所に別の修正を行う、など)

Page 6: Git overview (v 0.96)

6

概念的ワークフロー

● 最初にレポジトリから作業用ディレクトリ(作業ツリー)にファイルを展開 = チェックアウト

● 作業ツリーを変更● 変更点をレポジトリに書き戻す = チェックイン● 問題が起きたら

– 単純に古いバージョンをチェックアウトして差し戻す– 最近の修正差分をみて、問題点を発見 → 修正

Page 7: Git overview (v 0.96)

7

git local

(ローカル編)

Page 8: Git overview (v 0.96)

8

git のモデル(1) - コミットツリー

● メインのデータ構造● コミットの親子関係を示す

● git を使う上で最重要要素! 常にツリーの状態を把握しよう

XXサイト、最初のバージョン

タイトル画像を追加

イベント情報を追加

タイトルを冬バージョンへ

冬のイベントを追加

日付が間違っていたのを修正

Page 9: Git overview (v 0.96)

9

(余談)「ツリー」とは言うけど

● 実際には片方向有向グラフ– ルートノードは複数存在することがある

– 各ノードは1つ以上の親への参照を持つ(ルート以外)

Page 10: Git overview (v 0.96)

10

git のモデル(2) - オブジェクトDB

● SHA1 Digetst をキーにした Key-Value ストレージ● 実体はレポジトリトップの .git の下に存在する● 主なオブジェクトタイプ

– commit: コミットメッセージとメタ情報– tree: ディレクトリ– blob: ファイルの実体

● Blob はバイナリそのまま、それ以外は RFC822 風(?)の形式で表したテキストのダイジェストを取るだけ

Page 11: Git overview (v 0.96)

11

オブジェクトの関連

commit

commit

commit

tree

blob

blob

tree

tree

tree

blob

blob

blob

blob

blob

Page 12: Git overview (v 0.96)

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

Page 13: Git overview (v 0.96)

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

Page 14: Git overview (v 0.96)

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

Page 15: Git overview (v 0.96)

15

git のモデル(3) - リファレンス

● ブランチ、タグなどオブジェクトではない参照ラベル

● 任意の名前を持ち、通常は commit の SHA1 を指している

Page 16: Git overview (v 0.96)

16

ブランチとタグ● 一つのコミットのSHA1を指しているラベル

● ブランチはコミットが進むと移動していく

● タグは移動しない● このスライドでは説明しないけど注意:ラベルではない annotated tag というのもある (DB にオブジェクトとして記録される)

master

experimental

release_01

db-tune

release_02

Page 17: Git overview (v 0.96)

17

HEAD

● 現在チェックアウトしているブランチを指すポインタ

● 操作対象を省略した場合はたいてい自動的に HEAD (もしくは HEAD がさしているブランチ) を対象にする

● コミットのSHA1を直接指すこともできる (例外的な使い方)

master

experimental

release_01

db-tune

release_02

HEAD

Page 18: Git overview (v 0.96)

18

git コマンド

● レポジトリに cd して、git <サブコマンド>

● 今から使うサブコマンド– init: レポジトリ初期化– add: ファイルをコミット予定(index)に追加– commit: 実際のコミットを行う– branch: ブランチの一覧、作成、削除– checkout: 指定したブランチをチェックアウトし作業ツリーを更新

Page 19: Git overview (v 0.96)

19

git の具体的な作業の流れの例● レポジトリを作る

–git init● コミット予定に追加する

–git add● コミット

– git commit● 別作業をするためにブランチを作成

– git branch●新しいブランチに切り替える

–git checkout● 修正してコミット

– git commit -av●元のブランチに戻る

– git checkout

Page 20: Git overview (v 0.96)

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

Page 21: Git overview (v 0.96)

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

Page 22: Git overview (v 0.96)

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

Page 23: Git overview (v 0.96)

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

Page 24: Git overview (v 0.96)

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'

Page 25: Git overview (v 0.96)

25

ブランチ(ラベル)は重要

● ブランチのついていないコミットの枝は見えなくなる(そしてそのうちgcで回収される)

● マージや複数のレポジトリ連携でもブランチを使って操作する

● 常にツリーの状態を意識(チェック)しよう– gitk --all

– git log --graph

Page 26: Git overview (v 0.96)

26

git log --graph

Page 27: Git overview (v 0.96)

27

gitk --all

Page 28: Git overview (v 0.96)

28

git remote

(リモート編)

Page 29: Git overview (v 0.96)

29

Git の分散レポジトリ● 各人がそれぞれ、(完全な)レポジトリと作業ツリーのセットを持つ

● システム的には中央は存在しない– でも概念的には作ってもいい– 実際のプロジェクト運営では作成する事が多い– その場合は作業ツリーを持たない特殊(bare)なレポジトリを作るといい

● 組織、運用に合わせて好きなように構成可能● レポジトリ間で足らないオブジェクトを送り合う● 作業ツリーへの操作や反映は、各々で行う

Page 30: Git overview (v 0.96)

30

自分のレポジトリと作業ツリーの間で作業

ReposWT

Alice

Checkout

Commit ReposWT

Rob

Checkout

Commit

Page 31: Git overview (v 0.96)

31

それぞれのレポジトリ間でやりとり

ReposWT

Alice

ReposWT

Rob

ReposWT

Joe

Page 32: Git overview (v 0.96)

32

中央にレポジトリを置く運用

ReposWT

Alice

ReposWT

Joe

ReposWT

Rob

Bare Repository

Repos

Page 33: Git overview (v 0.96)

33

それぞれが公開用レポジトリを持つ場合

ReposWT

Alice

ReposWT

Joe

ReposWT

Rob

Rob's public repo

Repos

Alice's public repo

Repos

Joe's public repo

Repos

Page 34: Git overview (v 0.96)

34

マージ(pull)機構付きの特殊な公開レポジトリ(githubなど)

ReposWT

Alice

ReposWT

Joe

ReposWT

Rob

Rob's public repo

Repos

Alice's public repo

Repos

Joe's public repo

Repos

Page 35: Git overview (v 0.96)

35

リモートレポジトリ連携● 単にお互いを比較して、存在しないオブジェクトを交換する● 操作

– clone: レポジトリをコピーして新たなレポジトリを作成– fetch: 相手のレポジトリから自分に無い部分を取得– push: 自分のレポジトリから相手にオブジェクトを書き込み、相手のブランチラベルを移動させる

– pull: fetch + merge

● 外部レポジトリURLを名前(ラベル)を付けて管理– 例: (URL=) http://github.com/sugi/btr-backup.git => (ラベル) github

– 標準の参照先(clone元)はディフォルトでは origin と言う名前

Page 36: Git overview (v 0.96)

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

Page 37: Git overview (v 0.96)

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

Page 38: Git overview (v 0.96)

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

Page 39: Git overview (v 0.96)

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

Page 40: Git overview (v 0.96)

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

Page 41: Git overview (v 0.96)

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

Page 42: Git overview (v 0.96)

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

Page 43: Git overview (v 0.96)

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

Page 44: Git overview (v 0.96)

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

Page 45: Git overview (v 0.96)

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

Page 46: Git overview (v 0.96)

46

Pushの補足と注意● 基本的に push する前に pull すること!

● 標準では HEAD の指しているブランチだけが相手に送られ、同名のリモートブランチラベルを移動する– 送るブランチ、動かすブランチの都度指定は可能。設定変更して標準で送る物を変更することもできる

– push によって相手に新しいブランチを作成する事もできる (空のレポジトリに push する場合は指定が必須)

● Push 先が作業ツリーを持っている場合(bare でない場合)、標準では相手の HEAD のさしているブランチは動かせない

● 相手のブランチを動かすには、"FastForward" である必要がある– FastForward = 前方向に動かすだけで新しい位置に行けること– マージの場合は、ちゃんとツリー上で繋がっている必要がある (手で同じ修正を入れた場合はFast Forward にならない)

● 最初は相互に pull だけ使ったほうがわかりやすい

Page 47: Git overview (v 0.96)

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

Page 48: Git overview (v 0.96)

48

git refs

(参考と補足)

Page 49: Git overview (v 0.96)

49

鉄板の参考書籍: 入門Git

● 秀和システム ISBN:978-4798023809

● 現在の Git の開発者/プロジェクトリーダ/メンテナである 濱野純 氏が書いた書籍

● 題名と違い、ぜんぜん入門だけじゃない● 設計理念から内部構造、具体的な操作と例、Tips、コミュニティまですべて詰まってます

Page 50: Git overview (v 0.96)

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

Page 51: Git overview (v 0.96)

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

– よく使うコマンドは省略形のエイリアスを作っておくと楽になる

Page 52: Git overview (v 0.96)

52

覚えておくと便利なサブコマンド等● reset: HEAD と HEAD が指しているブランチラベルを好きな場所に移動する– --hard を付けると作業ツリーも更新する– git reset --hard だけなら現在の作業ツリーをリセット

● gui: tk 版 gui を起動する。Index の状態を表示/操作するには便利● mergetool: 衝突時に gui のマージツール (meld, qdiff3 など) を起動してマージを行う。エディタで編集するよりこちらの方が楽な場合も多い

● revert: 指定したコミットを反転したコミットを作成し、修正を打ち消す

● commit には必ず -v をつけよう。ログ編集時に Diff が確認できる

Page 53: Git overview (v 0.96)

53

Git のホスティングサービス

● SourceForge.JP● github.com● Google Code● SourceForget.net● repo.or.cz

● 他にも海外にはたくさん