今までプログラムのバージョン管理はSubversion(以降SVN)でやっていましたが、最近主流となっているGitへ移行することとなりました。最終的にはGitHubにリポジトリを作成してバージョン管理をしようと思っていますが、Gitを使って見てSVNでのコミットとGitでのコミットなどの意味が違うことに戸惑いました。
そこで今回はSVNとGitの違いやGitの使い方で最低限知っておくべきことを整理してみたいと思います。
SVNとGitのバージョン管理の概要
SVN
SVNでのバージョン管理は、集中型バージョン管理と呼ばれていて、サーバーにインストールしたリモートリポジトリのみがソースのバージョン管理を行っています。
基本的な使い方は、リモートリポジトリから管理されているソースコードをプログラム修正する作業用端末にチェックアウトという操作でダウンロードします。この取得してきたソースコードを修正します。
修正したプログラムはコミットという反映操作をすることでリモートリポジトリに反映されます。
別の作業用端末で最新のソースコードを取得したいときは、同様にチェックアウトを行うことでチェックアウトまでにコミットされた最新のソースコードが取得されます。
Git
Gitでのバージョン管理は、分散型バージョン管理と呼ばれ、サーバー上のリモートリポジトリをローカルに複製(クローン)して使用します。SVNでいうところのチェックアウト的な操作です。SVNと違ってリポジトリはリモートとローカルに存在します。
基本的な使い方は、リモートリポジトリをクローンして作業用端末のローカルリポジトリにコピーします。作成したローカルリポジトリのソースを修正します。ここでSVNなら修正したソースをコミットするとリモートリポジトリに反映されますが、Gitでは反映されません。コミットすると作業用端末にクローン下ローカルリポジトリにのみ反映されます。リモートリポジトリに反映するにはプッシュ(push)という操作を行う必要があります。
初めてリモートリポジトリの最新のソースコードを作業用端末に持ってくるときは、クローンを使いますがそれ以外の時はpull(プル)操作を行って、最新のソースコードを取得します。
※クローンとプルの違いは後述
- ローカルリポジトリに変更を反映させる→コミット(commit)
- リモートリポジトリに変更を反映させる→プッシュ(push)
Gitは、ローカルリポジトリ→リモートリポジトリと2段階でコミットするイメージです。バージョン管理をGitから始めた人にとってはそこまで気にならないと思いますがSVNを今まで使っていた人にとってはここが一番大きな違いだと思います。
Gitのほうがバージョン管理が複雑そうに見えますが、ブランチを切って運用する場合などはGitのほうが簡単だったりします。
その他の知っておいたほうがいいGit用語
mainブランチ(masterブランチ)
SVNでは、Trunk(トランク)に相当します。新しいリポジトリを作成するとmainという名前のブランチが作成されます。ブランチ運用をするときはこのmainブランチから新しいブランチを作成して開発を行うようになります。このmainブランチは結構最近までリポジトリを作成するとmasterという名前で作成され、masterブランチと呼ばれていました。この「master」という言葉が差別的なニュアンスがあるということで2020年10月からmainに変更になりました。なので参考資料や文献にはmasterブランチと書かれているものはmainと読み替えると理解できると思います。
よく使うGit操作
pull
上述のcloneと同じくリモートリポジトリの内容をローカルにコピーしてくるときに使います。
cloneはファイルをすべてコピーするのに対して、pullはローカルとリモートで差異があるファイルをコピーするという違いがあります。
clone(クローン):すべてのファイルをコピー
pull(プル):リモートとローカルで差異があるファイルをコピー
fetch(フェッチ) + merge(マージ) = pull(プル)
上述したpullの操作を細かく説明するとリモートリポジトリからローカルリポジトリに最新ソースを取得してマージを行っています。fetchはリモートリポジトリから最新ソースを取得するだけでマージはしない状態になります。もっと細かく言うと、origin/mainブランチというローカルのmainブランチとは違うブランチに取得したソースをコピーします。リモートリポジトリの内容をフェッチで取得して確認してからローカルに反映したいときに使用します。フェッチした内容を確認してマージしても問題なければマージします。
リモートリポジトリを確認せずにフェッチとマージも一括でしたい場合はpull(プル)を使います。
Gitでのチェックアウト
Gitでのチェックアウト(checkout)は、ブランチをただ切り替えるだけです。上述のSVNで使うチェックアウトとは全く異なるので注意が必要です。
まとめ
- SVNは集中型バージョン管理、Gitは分散型バージョン管理
- Gitのcommit(コミット)はローカルリポジトリの変更を反映させる
- リモートリポジトリの変更を反映させるときはpush(プッシュ)
- cloneは全ファイルをコピー、pullは差分のファイルをコピー
- fetch(フェッチ) + merge(マージ) = pull(プル)
コメント