98
SCM Boot Camp bleis-tift July 30, 2011

SCM Boot Camp

Embed Size (px)

DESCRIPTION

SCM Boot Campでの発表資料です。

Citation preview

Page 1: SCM Boot Camp

SCM Boot Camp

bleis-tift

July 30, 2011

Page 2: SCM Boot Camp

自己紹介

id:bleis-tift / @bleis

名古屋から来ました

F#プログラマです

お仕事でGit使ってます

お仕事以外でもGit使ってます

Page 3: SCM Boot Camp

自己紹介

Git-HooksっていうGitのフックスクリプト書いてます。

https://github.com/bleis-tift/Git-Hooks

rewriteブランチで時期バージョン開発 (停滞)中

Page 4: SCM Boot Camp

利用者の声そのいち

Page 5: SCM Boot Camp

利用者の声そのに

名古屋Reject会議にて、 の発表

Page 6: SCM Boot Camp

利用者の声そのさん

Geek Barにて、

「え、まだ名前 (bleis hookに)変えてなかったんですか?」

Page 7: SCM Boot Camp

・・・

rewriteブランチが固まったら名前変えます・・・

Page 8: SCM Boot Camp

話すこと

バージョン管理

バージョン管理システムの分類

分散バージョン管理システム

SVNとの比較

運用例

事例紹介

オープンソース寄りの話ではなく、業務寄りの話になります。Git固有の話とかはしません。ちょっとしか。

Page 9: SCM Boot Camp

バージョン管理

Page 10: SCM Boot Camp

バージョン管理とは

変更の履歴を管理することそれだけではよく分からないので、バージョン管理する目的を考えると・・・

Page 11: SCM Boot Camp

バージョン管理する目的

いつでも過去のバージョンに戻せる

変更に対するメタデータの格納

変更の調査

大体こんな感じ。なので、バージョン管理とは・・・

Page 12: SCM Boot Camp

バージョン管理とは

過去の状態を取り戻すことができ、

変更の意味などを保持し、

変更に対する多様な調査を可能にすること

「過去バージョンに戻せる」が注目されがちでも、それだけじゃない

Page 13: SCM Boot Camp

日付.zipはバージョン管理と呼べるか

過去のバージョンには戻せるけど・・・

変更の意味は保持していない

変更に対する基本的な調査も困難

なので、日付.zipはバージョン管理とは呼べない

Page 14: SCM Boot Camp

履歴コメントはどうか

変更の意味は保持しているけど・・・

過去のバージョンに戻すのが困難

変更に対する基本的な調査も困難

何より可読性が落ち、バージョン管理以前の問題

なので、履歴コメントはバージョン管理とは呼べない

Page 15: SCM Boot Camp

二つとも採用したらどうか

カオス!バージョン管理を行うにはツールの採用が必要不可欠

Page 16: SCM Boot Camp

ツールを使わない言い分

1つの場所に全てが書いてないと不安・・・

バージョン管理システム?何それ・・・

色々できるらしいけど・・・使い方わかりません

ツールがバグってたら・・・

ツールを知れば解決!SCM Boot Campマジ SCM Boot Camp

Page 17: SCM Boot Camp

ツールを知るということ

動作、コマンド

概念、文化、思想

実装

「動作」さえ知っていれば一応使えるでも、使いこなすには「概念」を知る必要がある

「実装」はお好みで・・・

Page 18: SCM Boot Camp

概念

ツールごとに文化や思想が違うので、概念も異なる

例:Git⇔Mercurial

基本的な操作は同じように見えても、細かいところは結構違う

ちょっと横道に逸れて、どういうところが違うのか見てみましょう

Page 19: SCM Boot Camp

バージョン管理システムの分類

Page 20: SCM Boot Camp

バージョン管理システムの分類

メインでGitを使っているので、Gitと他のVCSとの違いを中心に

ファイル名の管理方法

ファイル内容の管理方法

協調方法

集中管理 or 分散

Page 21: SCM Boot Camp

ファイル名の管理方法

例えば、ファイル名の変更や移動をどう扱うか。管理しない

本当に何もしない (CVS)ヒューリスティックに解決 (Git)

専用コマンドを用意 (SVN/HG/BZR)

Page 22: SCM Boot Camp

ファイル名の管理方法

ヒューリスティックに判断する方法の利点は、通常のファイル操作コマンドが使える点。欠点は、確実ではない点。専用コマンドを用意する方法の利点は、変更のメタデータとして記録するので、確実な点。欠点は、通常のファイル操作コマンドが使えなくなってしまう点。

Page 23: SCM Boot Camp

ファイル内容の管理方法

差分を積み上げて最新の状態を表す (SVNなど)

スナップショットを格納する (Git)

Page 24: SCM Boot Camp

ファイル内容の管理方法

Page 25: SCM Boot Camp

ファイル内容の管理方法

Page 26: SCM Boot Camp

ファイル内容の管理方法

Page 27: SCM Boot Camp

協調方法

ロック (VSS)

マージ (その他)

Page 28: SCM Boot Camp

ロック VS マージ

ロック方式の利点は、コンフリクトが発生しない点・・・本当?ファイル内でのコンフリクトは発生しないけど、ファイル間の見えないコンフリクトは普通に発生する・・・バイナリをいじるのでもない限り、ロック方式に利点はないと思うんだ・・・

Page 29: SCM Boot Camp

集中管理 or 分散

集中管理 (SVN)

分散 (Git/HG)

両方 (BZR)

お待たせしました。ようやく分散バージョン管理システムの話です。

Page 30: SCM Boot Camp

分散バージョン管理システム

Page 31: SCM Boot Camp

DVCSよくある?勘違い

一つのリポジトリが分散している、という誤解

commitのたびにほかのリポジトリに通知が行く、という誤解

一人だからDVCSじゃなくていいや、という誤解

業務では集中管理型じゃないと破たんする、という誤解

Page 32: SCM Boot Camp

一つのリポジトリが分散?

Page 33: SCM Boot Camp

一つのリポジトリが分散?

最初そう思ってた

これは「分散」という言葉がまずい?

実際には「完全なリポジトリ」が複数存在する

Page 34: SCM Boot Camp

commitのたびに同期?

Page 35: SCM Boot Camp

commitのたびに同期?

最初そう思ってた

操作のたびに他の人のリポジトリ弄るとか何それこわい

リポジトリ間の同期は明示的に行う

Page 36: SCM Boot Camp

一人だからDVCSいらない?

むしろ、一人の際に集中管理型を使う利点はない一人で使うとしてもDVCSにはメリットが多い

手軽高速高機能

ここでも「分散」という言葉が・・・

Page 37: SCM Boot Camp

業務では集中管理型?

better集中型としてのDVCS

向き不向きはあるけど、それって他のツールでも同じこと

中央にSVNを置き、個人でDVCSというのも可能

例えば、日本語ファイル名を使いまくっているところにGitを導入するのは難しい

Page 38: SCM Boot Camp

バージョン管理する目的 (再掲)

いつでも過去のバージョンに戻せる

変更に対するメタデータの格納

変更の調査

DVCSはこれらの目的のためだけにとどまらない

Page 39: SCM Boot Camp

DVCSでできるようになること

自由なコミット

自由なブランチ

自由な歴史改変

DVCSでは、集中管理型ではできなかったことができるように!

Page 40: SCM Boot Camp

トピックブランチ

DVCSではローカルブランチを気軽に作れる→作業の単位でブランチを作り、作業が終わったらマージ

Page 41: SCM Boot Camp

作業?

hoge機能追加、とか、バグ修正、とかDVCSならこんな小さなレベルでブランチを使っても苦になりません。

Page 42: SCM Boot Camp

コミットの粒度

トピックブランチを使うと、コミットの粒度を細かくできる

いつコミットすればいいの?

保存したということは、何かの区切りの可能性が高い

最初のうちは、保存のタイミングでやったことを顧みる

Page 43: SCM Boot Camp

rebase

枝分かれしてしまった状態これを、どの変更も反映して合流させるには・・・

Page 44: SCM Boot Camp

rebase

枝分かれしてしまった状態これを、どの変更も反映して合流させるには・・・

Page 45: SCM Boot Camp

rebase

rebaseはDVCSならではの方法です。こんな感じ

Page 46: SCM Boot Camp

rebase

rebaseはDVCSならではの方法です。こんな感じ

Page 47: SCM Boot Camp

rebase

トピックブランチ程度の小さなブランチに

大きいブランチだときつい

Page 48: SCM Boot Camp

rebaseの何が嬉しいの?

リポジトリの状態がきれい

歴史の二分探索がカチッとはまる

参考:マージコミットの分割が1本線の履歴の分割よりも困難となる理由http://www8.atwiki.jp/git jp/pub/Documentation.ja/user-

manual.html#bisect-merges

Page 49: SCM Boot Camp

BTS/ITSと使う

トピックブランチを使い、コミットの粒度が細かくなり、ブランチのマージに rebaseを使うようになると・・・

どこからどこまでがどの作業のコミット?

BTS/ITSと一緒に使うのは一つの解決策

Page 50: SCM Boot Camp

SVNとの比較

Page 51: SCM Boot Camp

SVNとの比較

まだまだ現役の SVNと以下の観点で比べてみます。

コマンド

ブランチ

開発スタイル

Page 52: SCM Boot Camp

コマンド

SVNには svnコマンドとは別に、リポジトリ用コマンドがある

Page 53: SCM Boot Camp

ブランチ

SVNではブランチは自分の環境内で閉じないのに対して、DVCSではローカルなブランチが作れるリポジトリの cloneもブランチと考えることも可能

Page 54: SCM Boot Camp

開発スタイル

リポジトリの用意

コミットが失敗する可能性

マージの失敗の取り消し

リモートとのやり取り

Page 55: SCM Boot Camp

リポジトリの用意

SVNの場合・・・サーバにログインして、リポジトリ作って・・・面倒!

DVCSの場合・・・

git init

より気軽にバージョン管理を開始できる!

Page 56: SCM Boot Camp

コミットが失敗する可能性

Page 57: SCM Boot Camp

コミットが失敗する可能性

Page 58: SCM Boot Camp

コミットが失敗する可能性

Page 59: SCM Boot Camp

コミットが失敗する可能性

Page 60: SCM Boot Camp

コミットが失敗する可能性

Page 61: SCM Boot Camp

コミットが失敗する可能性

Page 62: SCM Boot Camp

コミットが失敗する可能性

Page 63: SCM Boot Camp

コミットが失敗する可能性

Page 64: SCM Boot Camp

コミットが失敗する可能性

Page 65: SCM Boot Camp

コミットが失敗する可能性

Page 66: SCM Boot Camp

コミットが失敗する可能性

Page 67: SCM Boot Camp

コミットが失敗する可能性

Page 68: SCM Boot Camp

マージの失敗

Page 69: SCM Boot Camp

マージの失敗

Page 70: SCM Boot Camp

マージの失敗

Page 71: SCM Boot Camp

マージの失敗

Page 72: SCM Boot Camp

マージの失敗

Page 73: SCM Boot Camp

マージの失敗

Page 74: SCM Boot Camp

マージの失敗

Page 75: SCM Boot Camp

マージの失敗

Page 76: SCM Boot Camp

マージの失敗

Page 77: SCM Boot Camp

リモートとのやり取り

SVN・・・ほぼ全てがリモートとのやり取りDVCS・・・ほぼ全てがローカルで完結限られたコマンド (cloneや pushや pull)がリモートとやり取り

Page 78: SCM Boot Camp

リモートとのやり取り

SVN・・・ほぼ全てがリモートとのやり取りDVCS・・・ほぼ全てがローカルで完結限られたコマンド (cloneや pushや pull)がリモートとやり取り

Page 79: SCM Boot Camp

リモートとのやり取り

SVN・・・ほぼ全てがリモートとのやり取りDVCS・・・ほぼ全てがローカルで完結限られたコマンド (cloneや pushや pull)がリモートとやり取り

Page 80: SCM Boot Camp

リモートとのやり取り

SVN・・・ほぼ全てがリモートとのやり取りDVCS・・・ほぼ全てがローカルで完結限られたコマンド (cloneや pushや pull)がリモートとやり取り

Page 81: SCM Boot Camp

リモートとのやり取り

SVN・・・ほぼ全てがリモートとのやり取りDVCS・・・ほぼ全てがローカルで完結限られたコマンド (cloneや pushや pull)がリモートとやり取り

Page 82: SCM Boot Camp

リモートとのやり取り

SVN・・・ほぼ全てがリモートとのやり取りDVCS・・・ほぼ全てがローカルで完結限られたコマンド (cloneや pushや pull)がリモートとやり取り

Page 83: SCM Boot Camp

リモートとのやり取り

SVN・・・ほぼ全てがリモートとのやり取りDVCS・・・ほぼ全てがローカルで完結限られたコマンド (cloneや pushや pull)がリモートとやり取り

Page 84: SCM Boot Camp

リモートとのやり取り

SVN・・・ほぼ全てがリモートとのやり取りDVCS・・・ほぼ全てがローカルで完結限られたコマンド (cloneや pushや pull)がリモートとやり取り

Page 85: SCM Boot Camp

リモートとのやり取り

SVN・・・ほぼ全てがリモートとのやり取りDVCS・・・ほぼ全てがローカルで完結限られたコマンド (cloneや pushや pull)がリモートとやり取り

Page 86: SCM Boot Camp

注意点

最小単位であるコミットレベルでリモート通信している SVNと異なり、DVCSではコミットレベルではリモート通信が発生しないので、pushし忘れることも・・・

Gitの場合、http://d.hatena.ne.jp/pasela/20110216/git not pushed

などを参考にどうぞ。

Page 87: SCM Boot Camp

運用例

Page 88: SCM Boot Camp

中央にSVNを使い、個人でDVCSを使う

MercurialやBazaarでも同じようなことができる

Page 89: SCM Boot Camp

中央にSVNを使い、個人でDVCSを使う

他の人に影響を与えずに導入できるコミットフックを使っている場合は要注意

たくさんのコミットを一気に SVN側に投げると・・・SVNのコミットと同程度の大きさに留め、こまめにコミットするか、トピックブランチ一つ分を圧縮して一つのコミットにまとめる

SVNを介して、複数のDVCSを共存させる?

Page 90: SCM Boot Camp

作業ディレクトリに混ぜて使う

ブリッジが用意されていない場合など、最後の手段

Page 91: SCM Boot Camp

中央にもDVCSを使う

中央もDVCSになっていたほうが何かと便利

Page 92: SCM Boot Camp

階層

可能性は無限大!

Page 93: SCM Boot Camp

事例紹介

Page 94: SCM Boot Camp

事例紹介

と言っても、うちの事例ひとつだけですが

Page 95: SCM Boot Camp

Jenkinsとの組み合わせ

うちの会社で運用している構成CIのビルドが失敗するような pushを弾く

.

.

.

1 中央のリポジトリへの pushを禁止

.

.

.

2 サーバ側に開発者ごとの push用リポジトリを用意

.

.

.

3 各 push用リポジトリから中央のリポジトリへのpushは CIが行う

Page 96: SCM Boot Camp

Jenkinsとの組み合わせ

Page 97: SCM Boot Camp

Jenkinsとの組み合わせ

開発者が 5人以下のチームで採用

初めて構築、運用しだして 1年経過

新規案件を中心に、5案件ほど回した

小さいチームではうまくいくことが分かった

大きいチームでは難しいかも・・・?

Page 98: SCM Boot Camp

おわり