バージョン管理ツールはこれまでSubversionを使ってきました。ところが新規プロジェクトに携わることになったことをきっかけに、Gitを利用することとなったのですが、SubversionとGitではそもそものバージョン管理の考え方自体に違いがあり、コマンドも同じような名前でもSubversionとGitでは異なった働きをするものがあり混乱したため、違いを整理してみました。
1. Gitは分散型バージョン管理システム
- Gitは分散型バージョン管理システム(Subversionは集中型バージョン管理システム)
- リポジトリには2種類がある
- リモートリポジトリ
- 専用のサーバに配置して複数人で共有するためのリポジトリ
- ローカルリポジトリ
- ユーザ一人ひとりが利用するために、自分の手元のマシン上に配置するリポジトリです。
- 2種類に分かれているメリット
リポジトリをリモートとローカルの2種類に分けることで、普段の作業はローカルリポジトリを使って全て手元のマシン上で行うことができます。自分のローカルリポジトリで作業した内容を公開したい時は、リモートリポジトリにアップロードして公開します。また、リモートリポジトリを通してほかの人の作業内容を取得することもできます。
抜粋:: 株式会社ヌーラボ. “サルでもわかるGit入門 for Mac OS X(GUI)”。 iBooks. https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewBook?id=823F8E8C1B6EC9D1BC7E3F129B232AA7
2. リポジトリは「リモートリポジトリ名/ブランチ名」で表記
- 前述の通り、リポジトリには「リモート」「ローカル」の2種類があるため、それらを区別して表記する。
- リポジトリは「リモートリポジトリ名/ブランチ名」で表記する。
- リモートリポジトリ名には origin がよく用いらられる。理由は下記。
コンソールの場合プッシュやプルは実行時にリモートリポジトリ名を省略すると、originという名前のリモートリポジトリを使用します。そのため、リモートリポジトリにはoriginという名前を付けるのが一般的です。
抜粋:: 株式会社ヌーラボ. “サルでもわかるGit入門 for Mac OS X(GUI)”。 iBooks. https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewBook?id=823F8E8C1B6EC9D1BC7E3F129B232AA7
3. Gitには「インデックス」が存在する
- インデックスとは、ワークツリー(subversionで言う「作業ディレクトリ」)上にあるファイルを「仮コミット」するかを管理するもの。
編集して add して commit するのは Subversion と同じ。 違うのは、 Subversion の add が最初の1回だけなのに対して、 Git は毎回 add が必要なこと。
http://www.machu.jp/diary/20100506.html#p01
- インデックスに登録することを、「ステージする」と呼ぶ。
4. trunkはなく全てbranch
- subversion のように trunk / branches / tags というディレクトリの分類はない。
- タグはあるが、 trunk はなく、全てブランチとなる。
- subversion でいう trunk は master ブランチ。
5. マージは2種類ある
- マージは2種類ある
- merge
- svn mergeに類するマージ方法
- rebase
- subversionにはないマージ方法。マージ元のソースを、マージ先の先頭に統合し、2本のブランチを1本にする。
Tips よく使うコマンド
ソースコードを取得する類のもの
- clone
- リモートにあるリポジトリを複製。ローカルマシンに、リポジトリからソースを取得するという意味では svn checkout に類する。 ※ちなみに git で checkout と言ったら subversion では switch に類する
- pull
- リポジトリから更新分のソースコードを取得する。リモートにコミットされたソース(他の人が編集した内容)をローカルのソースに取り込むときなどに利用。svn updateに近い。
- fetch
- pullに似ているが、リポジトリから取得したソースコードを、ローカルのソースにマージしない。差分を逐一確認してからマージしたい場合などに利用
コミットする類のもの
- add
- インデックスに登録。svn add に類するが、初回のみでなくコミット毎に必要
- commit
- コミットする。svn commit とほぼ同じ。
- push
- リモートリポジトリへローカルのソースコードを反映させる。subversionにはないコマンド。
コミットをまとめなおしたいときなど
- git reset HEAD^
- 直前のコミットをなかったことにし(履歴も取り消す) 直前のコミットでコミットされたファイルは、ファイル内容はそのままで作業ディレクトリに移動する
参考サイト
- サルでもわかるGit入門 http://www.backlog.jp/git-guide/
- Subversion ユーザーが Git を使ってみた (基本操作編)
http://www.machu.jp/diary/20100506.html#p01