🌳
プロジェクトでSVNを導入していたのでGitと比較する
はじめに
新規プロジェクトでSVNを導入している現場に遭遇しました。
Git使った方が良いんじゃないかと思ったのですが当時は違いや良さを説明できませんでした。
その時説明できなかったGitとSVNの違いを比較してみたという記事になります。
ツールの基本知識はある前提で細かな説明は省いています。
GitとSVNの特徴を比較
Git | SVN | |
---|---|---|
バージョン管理方法1 | 分散管理型 | 集中管理型 |
バージョン管理方法2 | 修正ファイルのスナップショットを管理 | 修正ファイルの差分を管理 |
リポジトリ | リモートリポジトリとローカルリポジトリの2つ | 中央リポジトリのみ |
ローカル環境での扱い | ローカルリポジトリで独立してバージョン管理 | 中央リポジトリのコピー、適宜同期が必要 |
ブランチ | コミットの流れを分岐させる | ディレクトリのコピー |
マージ | 容易 | 複雑になりがち |
ソースレビュー | GitHub、GitLabなどで可能 | 自前で仕組み化が必要 |
パフォーマンス | ローカルで完結するため処理が速い | 中央リポジトリとの通信が発生するため遅くなりがち |
学習コスト | 高い | 低い |
Gitのメリット(SVNのデメリット)
- 分散管理型である
Gitではローカルにリポジトリを持つことができ、他の開発者の修正の影響を受けずに開発を進めやすいです。また、開発者の数だけローカルリポジトリが存在する為リモートリポジトリのバックアップを改めて取得する必要がないという利点があります。
SVNでは一つのリポジトリに集約されてしまうため、誰かがコンパイルの通らないコードを作成してしまうと全体に影響してしまいます。 - ブランチ作成の処理コストが低い
SVNでブランチを作成する際にはディレクトリごとコピーする必要があり、PJ規模が大きいとブランチ作成のコピーに時間を要します。Gitのブランチ作成とはコミットツリーを分岐させるだけであり、ファイルコピーなどの余分な処理が不要です。 - マージが容易
Gitではバージョン管理方法の違いによりマージ処理が容易となっています。
SVNではマージ履歴を持たないためコミットメッセージなどで工夫が必要となるなどマージ処理が大変で気の使う作業となっていました。 - 品質管理(ソースレビュー)がしやすい
Gitを使う場合大半がGitHubやGitLabのホスティングサービスを利用しています。
こちらのサービスではソースレビュー機能がついており、PG品質の管理がしやすいです。 - コミットツリーがきれいに保てる
Gitではrebaseコマンドで複数のコミットを一つにまとめる、誤ったコミットをコミットツリーから削除することができます。svnはrevertしかできないため誤ったコミットなどの履歴は残ったままになってしまいます。
また、並行開発時にはGitではcherry-pickコマンドに別ブランチの特定のコミットを取得できます。SVNの場合はマージが必要となり履歴の管理が複雑になってしまいます。 - 連携できるツールが豊富
バージョン管理の主流はGitなので、モダンな開発で使われるツールのほとんどはGitと連携できるように作られています。CI/CD、プロジェクト管理ツール、エディターなど。
追記
※SVNも調べると連携できるものは結構ありました
Jenkins、Travi CI、Back log、redmine、Eclipse、VS Code、Visual Stadioなど。
Gitのデメリット
- 学習コストが高い
Gitの操作や概念を理解するのに相応の時間が必要になります。
理解しきれず雰囲気で使用するとコミットツリーが壊れたりなど本末転倒になりやすいです。 - ホスティングサービスの設定、構築
GitHubやGitLabなどのホスティングサービスが基本的に必要です。(なくても一応使えますが)
GitHubを使う場合は有料のアカウントが必要となります。無料であればGitLabがありますがサーバーを立てて構築する必要があります。Gitを理解していて、この辺りを取りまとめられる人が必要となります。 - git flowなどブランチ戦略の理解が必要
git学習の一部になりますが、gitではブランチを切って開発するためブランチ戦略についても理解が必要です。
SVNのメリット
- 学習コストが低い
複雑な概念があまりないので、Gitに比べて理解しやすいです。 - 導入、操作が比較的簡単
ホスティングサービスを利用せずに使うのが標準的なため、共有ディレクトリにSubversionをインストールすれば手軽に使い始められるかと思います。クライアント端末にTortoise SVNを入れればより扱いやすいです。
まとめ
Gitを扱えるのであれば、Gitを導入しましょう。
ただし、プロジェクト方針次第ではSVNでも十分な場合もあります。
- 小規模であり、ブランチを切らずにmaster(trunk)のみ一本でバージョン管理する場合。
- レビュー機能を必要としていなかったり、最低限バージョン管理ができればよい。
Gitを理解して使えれば小規模PJでも開発効率を上げてくれるものになりますが、
理解せず使う場合はSVNを使うのと変わらなかったりします。
Gitの技術者がおらず、学習コスト、Git運用にかかるコストが見合わない場合は
SVNを使うという選択肢は仕方のない場合もあるのかと思います。
Discussion