どうも、エンジニアの黒砂糖です。

みなさんのプロジェクトはどうやってバージョン管理していますか?実は私の関わっているプロジェクトも最初はSVN(Subversion)を使用していました。当時まだ学生気分の抜けていなかった私は特に深い考えもせず「プロデューサーさんっ! 今はGitの時代ですよ、Git!!」とGitを推していました。
当然そんな言葉だけでは何も動きません。そこで、まずはgit-svnを通して自分がGitを使ってみる事で、Gitの利点や導入方法を調べる事にしました。その結果今ではすっかりGitに移行し、デザイナーの皆さんにまでGitが普及するようになりました。やはりきちんとした理解があると説得力が違うと思います。

さて、前置きが長くなりました。今日はそんなSVNからGitに移ったことで感じたGitの利点を3つにしぼってご紹介します。Gitを導入したいがイマイチ説得できない、Gitがよくわからないので使えない、Gitに移行してくれと頼まれて困っている・・・そんなだれかの一助になれば幸いです。

SVNはチームの成果しか管理出来ないが、Gitなら個人の作業をバージョン管理できる

SVNではコミットを行うとそれはすぐSVNのサーバーに送られ、メンバー全員に共有されます。それは必要な事なんですが、しかし開発中はソースが共有して欲しくない状態になる事も少なくありません。例えばprintfデバッグしている最中などです。そういったソースはコミットしないように注意しなければいけないし、万が一コミットしてしまった場合それを取り消すような事はほぼできないでしょう。デバッグ用の行をもれなく消すのは神経を使いますし、万が一余計な行まで消してしまっては非常に困ります。

その点Gitであれば、実際の実装とデバッグ用の追加部分を周りに迷惑をかけずに別々にコミットする事ができます。Gitはコミットしただけでは共有されることはありません。なぜならGitは分散型であるため、コミットは一度自分の手元だけでバージョン管理されるからです。そのため、一通り実装が済んだら一度コミットすることで、その先動作確認用にprintfをいくら増やしてもその差分だけを簡単に破棄できます。それからプッシュすれば間違いなくメンバー全員に共有する事ができますね。

またこの利点によって、「複数の実装パターンがあるけれどどちらが良いかな?」と検討する際にも、まず一つのパターンで実装してからコミットすることで、別のパターンを安全に試す事もできます。この場合は気に入ったほうのパターンのコミットだけ残せば良い訳ですね。(ブランチやリベースを積極的に使えば楽に行う事ができますし。)

gitとsvnのバージョン管理の差

SVNは一度失敗するとリカバリーが大変。Gitはその点が強力にサポートされている。

SVNはたしかにバージョンを管理してくれますが、そのわりに前のバージョンに戻るのはそれほど気軽にはできません。どこまで何を戻すかはプログラマ自信が判断しなければならないし、作業中のデータはコミットしなければ当然消えてしまいます。かといって頻繁に自分の作業途中の中途半端な状態をコミットしてしまっては、他のメンバーと作業が混ざってしまったり混乱を招いてしまうでしょう。

その点Gitはこの”戻る”という点も手厚くカバーしてくれます。リポジトリは分散型で別々に管理されているので、不安な箇所もこまかくコミットしておく事ができます。細かすぎるコミットはマージやリベースでうまくまとめたりすればメンバーに共有した時にも混乱を招く事も無くなります。

またその”戻る”方法に関してもGitは強力です。根元からcherry-pickで必要なコミットだけ選んで再構築しても良いですし、リベースコマンドはオプションでコミットの取捨選択や統合、さらには順番変更までが可能です。万が一必要なコミットを消してしまったり、変に統合してしまった場合でもreflogを使えば失ったコミットすら取り戻す事さえできます。この強力な戻す能力があるからこそ、Gitはその能力を余すところなく発揮できるのでしょう。

gitとsvnのリカバリー能力の差

SVNはマージする範囲を自分で調べなきゃいけない。そんなの馬鹿げてる

SVNでもっともありえない!と思った瞬間はマージでした。SVNでマージしようとした場合、どこからどこまでのコミットをどこに含めるのか、それを手動で細かく指定してやる必要がありました。ただでさえブランチを切るのに腰が重いというのに、一度分けてしまうとマージさせる事まで難しいのです。

このマージ操作に関してGitはとても快適です。Gitならマージしたいブランチを指定するだけ。どの範囲のコミットを混ぜるべきかはGitが判断してくれます。一度マージした事があるブランチなら、きちんとその差分を適用してくれるのです。自動でやってくれるということは人為的なミスが入り込む余地がありません。

マージに限らずブランチ周りの処理・操作はGitのほうがはるかに快適です。コマンドのわかりやすさもさることながら、その動作がとても快適です。そう、SVNよりもマージ操作が速いんです。以前SVNで開発していた頃にものすごくマージに苦労したブランチがありました。SVNでマージしようとしても時間はかかるし待たされたあげくコンフリクトが酷い。そんなブランチもためしにgit-svnを使ってgitでマージしてみたら、マージも速くてコンフリクトもなぜか数がぐっと減りました^^;

gitとsvnのマージの差

まとめ

どうでしょう?使い慣れたSVNを手放すのは大変だとは思いますが、それを補ってあまりある利点がGitにはあります。また、他のメンバーの習熟が不安ならばgit-svnを利用してじわっとリポジトリを移行することもできます。これを機会にぜひ明日からGitを使ってみてはいかがでしょうか?