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