どうも、客先常駐エンジニアのCLBです。
現在こんな環境で仕事をしています。
- 職場:SVN
- 家:Github(Git)
これをやってると、「こんな理由でGitの方がいい!」と感じてきたので書いてみます。
コミットしてもコンフリクトが起こらない
SVNで同じファイルを2人以上で触っていると、こんなことが起こります。
Aさん「作業出来た!コミット!」
SVN「Bさんの作業とコンフリクトしてます。」
Aさん「しゃーない。コンフリクト解消するか。」
SVN「解消を確認しました。コミットします。」
Aさん「作業出来た!コミット!」
SVN「Bさんの作業とコンフリクトしてます。」
Aさん「またかよ・・・」
「そうならないようにルールを決めるんだよ!」と言われましたが、
そのルールは大抵の場合、以下のような形になります。
- SVNでロックを掛け、他の人が触れないようにする。その間、他の人の作業は中断される。
- コミットをなるべくしないようにする。ちょっと前のものに戻す事はあきらめる。
Gitの場合、リモートからクローン
(SVNで言うチェックアウト)すると、
リポジトリが個々のローカル環境に作成されます。
コミットもそのローカルリポジトリに行われるので、この時点ではコンフリクトは起こりません。
「待って、それじゃあローカルからリモートに移すにはどうすればいいんじゃ」
と声が聞こえてきます。Gitではこの操作をプッシュ
と呼びます。
SVNではコミット=リモートリポジトリへ反映ですが、
Gitのコミットではリモートリポジトリへは反映されません。
反映はプッシュ
操作を行う事で初めてリモートリポジトリへ資産が移送される仕組みです。
この時、リモートリポジトリで何らかの変更があった場合はコンフリクトが発生します。
しかしSVNの時と比べ連続してコンフリクトを解消する手間が省け、
しかもコミットを積極的に行う事が出来るようになるのです。
他の人の作業が中断されたりすることもありません。
柔軟にコミットを管理することが出来る
前の項目でも述べた通り、コミットもそのローカルリポジトリに行われるので、
コミットを後から修正したり出来ます。
特に強力なのがsquash
機能です。
これは複数のコミットをまとめる事ができる機能で、
これを利用する事によりコミットログを綺麗にする事が出来ます。
SVN
では"たとえ細かい修正コミットでも無かった事にしてはいけない。"
というスタンスなので、このような事は出来ません。(シュタゲかな?)
先進的なツールと連携出来る。
※これは、私が知る範囲での話です。
問題等があれば遠慮無くコメントをお願いいたします。
Git
の良いところはGit
だけでは無く、Github
やGitLab
と言った先進的なツールと統合出来ることです。
これらのツールで良いところは、
- マージリクエスト時の比較ツールが見やすく、効率よくレビューを行う事が出来る。
- CIツールと連携してマージリクエスト時に自動的にテストを行う事ができ、その結果を上記のツール内で確認する事が出来る。
- xxのソースコードの何行目と言ったステップ単位でコメントを書く事が出来る。
という点があげられます。
特にこれらの機能が1つのツールで行えるため、SVN
で同様の事を実現しようとすると
ビルド確認は Jenkins
, タスク管理は Redmine
などツールが分散しないのが良いと感じました。
終わりに
今まで「Git
の方が良い。」とよく耳にしてましたが、
実際にやってみると「確かになぁ。」と思う部分があります。
これをみてGit
を使う現場が増えてくれれば良いと思います。