Your SlideShare is downloading. ×
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Git overview (v 0.96)
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Git overview (v 0.96)

2,867

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,867
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
4
Comments
0
Likes
2
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Git overview Version 0.96This 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
  • 7. git local(ローカル編) 7
  • 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 blobcommit blob treecommit 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 298e00bf81e1cb8f185bb0f3f3a7e36c4fe6de1eparent b94712703db282e8e227df510997c19ae0843f50author Alex Dunae <alex@dunae.ca> 1289601832 -0800committer Alex Dunae <alex@dunae.ca> 1289601832 -0800Update 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 .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 Rubys 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
  • 26. git log --graph 26
  • 27. gitk --all 27
  • 28. git remote(リモート編) 28
  • 29. Git の分散レポジトリ● 各人がそれぞれ、(完全な)レポジトリと作業ツリーのセッ トを持つ● システム的には中央は存在しない – でも概念的には作ってもいい – 実際のプロジェクト運営では作成する事が多い – その場合は作業ツリーを持たない特殊(bare)なレポジトリを作る といい● 組織、運用に合わせて好きなように構成可能● レポジトリ間で足らないオブジェクトを送り合う● 作業ツリーへの操作や反映は、各々で行う 29
  • 30. 自分のレポジトリと 作業ツリーの間で作業 Alice Rob Checkout CheckoutWT Commit Repos WT Commit Repos 30
  • 31. それぞれのレポジトリ間でやりとり Joe WT Alice Repos WT Repos Rob WT Repos 31
  • 32. 中央にレポジトリを置く運用 Bare Repository Repos Alice JoeWT Rob WT Repos Repos WT Repos 32
  • 33. それぞれが公開用 レポジトリを持つ場合Alices public repo Joes public repo Robs public repo Repos Repos Repos Alice Joe WT Rob WT Repos Repos WT Repos 33
  • 34. マージ(pull)機構付きの特殊な 公開レポジトリ(githubなど)Alices public repo Joes public repo Robs 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/tryorigin/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 typoorigin/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 autoupdateautoupdate 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 automationorigin/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 automationorigin/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 autoupdateorigin/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 autoupdateorigin/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 fileHEAD 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
  • 48. git refs(参考と補足) 48
  • 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

×