Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Git overview

Git overview

Tatsuki Sugiura

September 07, 2012
Tweet

More Decks by Tatsuki Sugiura

Other Decks in Programming

Transcript

  1. Git overview Version 0.96 (2012-09) This work is licensed under

    a Creative Commons Attribution-ShareAlike 3.0 Unported License. Tatsuki Sugiura <[email protected]>
  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) - コミットツリー • メインのデータ構造 • コミットの親子関係 を示す

    • git を使う上で最重要 要素! 常にツリー の状態を把握しよう XXサイト、最初のバージョン タイトル画像を追加 イベント情報を追加 タイトルを冬バージョンへ 冬のイベントを追加 日付が間違っていたのを修正
  7. 10 git のモデル(2) - オブジェクトDB • SHA1 Digetst をキーにした Key-Value

    スト レージ • 実体はレポジトリトップの .git の下に存在する • 主なオブジェクトタイプ – commit: コミットメッセージとメタ情報 – tree: ディレクトリ – blob: ファイルの実体 • Blob はバイナリそのまま、それ以外は RFC822 風(?)の形式で表したテキストのダイ ジェストを取るだけ
  8. 12 実際の例: commit オブジェクト tree 298e00bf81e1cb8f185bb0f3f3a7e36c4fe6de1e parent b94712703db282e8e227df510997c19ae0843f50 author Alex

    Dunae <[email protected]> 1289601832 -0800 committer 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
  9. 13 実際の例: tree オブジェクト tree 298e00bf81e1cb8f185bb0f3f3a7e36c4fe6de1e parent b94712703db282e8e227df510997c19ae0843f50 author Alex

    Dunae <[email protected]> 1289601832 -0800 committer Alex Dunae <[email protected]> 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
  10. 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
  11. 16 ブランチとタグ • 一つのコミットのSHA1を指し ているラベル • ブランチはコミットが進むと 移動していく • タグは移動しない

    • このスライドでは説明しない けど注意: ラベルではない annotated tag というのもある (DB にオブ ジェクトとして記録される) master experimental release_01 db-tune release_02
  12. 17 HEAD • 現在チェックアウトしてい るブランチを指すポインタ • 操作対象を省略した場合は たいてい自動的に HEAD (もしくは

    HEAD がさして いるブランチ) を対象にす る • コミットのSHA1を直接指 すこともできる (例外的な 使い方) master experimental release_01 db-tune release_02 HEAD
  13. 18 git コマンド • レポジトリに cd して、git <サブコマンド> • 今から使うサブコマンド

    – init: レポジトリ初期化 – add: ファイルをコミット予定(index)に追加 – commit: 実際のコミットを行う – branch: ブランチの一覧、作成、削除 – checkout: 指定したブランチをチェックアウトし 作業ツリーを更新
  14. 19 git の具体的な作業の流れの例 • レポジトリを作る – git init • コミット予定に追加する

    – git add • コミット – git commit • 別作業をするためにブランチを作成 – git branch • 新しいブランチに切り替える – git checkout • 修正してコミット – git commit -av • 元のブランチに戻る – git checkout
  15. 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
  16. 21 実際の例とレポジトリの動き (2) • ファイルを変更する • git add で変更した ファイルをステージ

    (indexに登録)する • commit $ date > date.txt First commit (working copy) master $ git add date.txt HEAD First commit (index) master HEAD (working copy) $ git comit -v -m 'Update data.txt' First commit master HEAD Update date.txt
  17. 22 実際の例とレポジトリの動き (3) • ブランチを作る • ブランチに移動 • ブランチでコミット $

    git branch ns-stamp First commit master HEAD Update date.txt ns-stamp $ git checkout ns-stamp First commit master HEAD Update date.txt ns-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
  18. 23 実際の例とレポジトリの動き (4) • master ブランチに戻る • コミット First commit

    master HEAD Update date.txt ns-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
  19. 24 実際の例とレポジトリの動き (5) • ns-stamp ブランチを マージ First commit master

    HEAD Update date.txt ns-stamp Add ns stamp Update date, again $ git merge ns-stamp Merge branch 'ns-stamp'
  20. 29 Git の分散レポジトリ • 各人がそれぞれ、(完全な)レポジトリと作業ツ リーのセットを持つ • システム的には中央は存在しない – でも概念的には作ってもいい

    – 実際のプロジェクト運営では作成する事が多い – その場合は作業ツリーを持たない特殊(bare)なレポジ トリを作るといい • 組織、運用に合わせて好きなように構成可能 • レポジトリ間で足らないオブジェクトを送り合う • 作業ツリーへの操作や反映は、各々で行う
  21. 33 それぞれが公開用 レポジトリを持つ場合 Repos WT Alice Repos WT Joe Repos

    WT Rob Rob's public repo Repos Alice's public repo Repos Joe's public repo Repos
  22. 34 マージ(pull)機構付きの特殊な 公開レポジトリ(GitHubなど) Repos WT Alice Repos WT Joe Repos

    WT Rob Rob's public repo Repos Alice's public repo Repos Joe's public repo Repos
  23. 35 リモートレポジトリ連携 • 単にお互いを比較して、存在しないオブジェクトを交換する • 操作 – clone: レポジトリをコピーして新たなレポジトリを作成 –

    fetch: 相手のレポジトリから自分に無い部分を取得 – push: 自分のレポジトリから相手にオブジェクトを書き込み、相手 のブランチラベルを移動させる – pull: fetch + merge • 外部レポジトリURLを名前(ラベル)を付けて管理 – 例: (URL=) http://github.com/sugi/btr-backup.git => (ラベル) github – 標準の参照先(clone元)はディフォルトでは origin と言う名前
  24. 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
  25. 37 実際の操作: リモート編 (1) • リモートから clone $ git clone

    host2.example.com:git/try First commit Add README.txt origin master autoupdate Makefie automation First commit Add README.txt master Makefie automation HEAD origin/master origin/autoupdate clone HEAD
  26. 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 automation HEAD origin/master origin/autoupdate HEAD Fix typo
  27. 39 実際の操作: リモート編 (3) • origin に push $ git

    push First commit Add README.txt origin master autoupdate Makefie automation First commit Add README.txt master Makefie automation HEAD origin/master origin/autoupdate HEAD Fix typo Fix typo push
  28. 40 実際の操作: リモート編 (4) • リモートブランチを元にローカルブランチを 作成し、そこにカレントブランチを移動 $ git checkout

    -b autoupdate origin/autoupdate First commit Add README.txt origin master autoupdate Makefie automation First commit Add README.txt master Makefie automation HEAD origin/master origin/autoupdate HEAD Fix typo Fix typo autoupdate
  29. 41 実際の操作: リモート編 (5) • ローカルでバグフィクスしてmasterにマージ $ git commit -av

    -m 'Fix automation bug' $ git checkout master $ git merge autoupdate First commit Add README.txt origin master autoupdate Makefie 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
  30. 42 実際の操作: リモート編 (6) • リモートの master が誰かに更新された First commit

    Add README.txt origin master autoupdate Makefie 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
  31. 43 実際の操作: リモート編 (7) • origin を pull (の fetch

    部分の様子) First commit Add README.txt origin master autoupdate Makefie 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 $ git pull pull (fetch) Add License file
  32. 44 実際の操作: リモート編 (8) • origin を pull (の merge

    部分) First commit Add README.txt origin master autoupdate Makefie 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 $ git pull Add License file merge origin/master
  33. 45 実際の操作: リモート編 (9) • origin に変更をふたたび push origin master

    First commit Add README.txt master Makefie automation HEAD origin/master origin/autoupdate HEAD Fix typo autoupdate Fix automation bug merge autoupdate $ git push Add License file merge origin/master push First commit Add README.txt Makefie automation Fix typo Fix automation bug merge autoupdate Add License file merge origin/master autoupdate
  34. 46 Pushの補足と注意 • 基本的に push する前に pull すること! • 標準では

    HEAD の指しているブランチだけが相手に送られ、同名のリ モートブランチラベルを移動する – 送るブランチ、動かすブランチの都度指定は可能。設定変更して標準で送 る物を変更することもできる – push によって相手に新しいブランチを作成する事もできる (空のレポジ トリに push する場合は指定が必須) • Push 先が作業ツリーを持っている場合(bare でない場合)、標準では相 手の HEAD のさしているブランチは動かせない • 相手のブランチを動かすには、"FastForward" である必要がある – FastForward = 前方向に動かすだけで新しい位置に行けること – マージの場合は、ちゃんとツリー上で繋がっている必要がある (手で同じ 修正を入れた場合はFast Forward にならない) • 最初は相互に pull だけ使ったほうがわかりやすい
  35. 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
  36. 49 鉄板の参考書籍: 入門Git • 秀和システム ISBN:978-4798023809 • 現在の Git の開発者/プロジェクトリーダ/メンテナであ

    る 濱野純 氏が書いた書籍 • 題名と違い、ぜんぜん入門だけじゃない • 設計理念から内部構造、具体的な操作と例、Tips、コ ミュニティまですべて詰まってます
  37. 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
  38. 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 – よく使うコマンドは省略形のエイリアスを作っておくと 楽になる
  39. 52 覚えておくと便利なサブコマンド等 • reset: HEAD と HEAD が指しているブランチラベルを好き な場所に移動する –

    --hard を付けると作業ツリーも更新する – git reset --hard だけなら現在の作業ツリーをリセット • gui: tk 版 gui を起動する。Index の状態を表示/操作するに は便利 • mergetool: 衝突時に gui のマージツール (meld, qdiff3 な ど) を起動してマージを行う。エディタで編集するよりこち らの方が楽な場合も多い • revert: 指定したコミットを反転したコミットを作成し、修 正を打ち消す • commit には必ず -v をつけよう。ログ編集時に Diff が確認 できる
  40. 53 Git のホスティングサービス • SourceForge.JP • github.com • Google Code

    • SourceForget.net • repo.or.cz • 他にも海外にはたくさん