Git をさわる機会が増えてきたので Subversion ユーザ目線で説明してみる
社長におねだりしたらベイスターズ買ってくれないかなぁ。どうもこんにちは nakamura です。
シーブレインでは今も昔もソース管理に Subversion を使い続けていますが、最近は協力会社さんとのやり取りなどで何かと Git にさわる機会が増えてきました。最初はチンプンカンプンでしたが、ようやく何となく基本的な部分が分かってきたので、Subversion ユーザ的な目線でちょこっと説明してみたいと思います。
コマンド例
初期設定
Git ではユーザ毎の設定内容も git コマンドで操作します。とりあえずいつも以下のような感じで設定してます。diff に使うコマンドとかも指定できるみたいですね。
# 名前
git config --global user.name "Tadashi Nakamura"
# メールアドレス
git config --global user.email [email protected]
# 色設定
git config --global color.ui auto
# 設定内容確認
git config --list
あと長ったらしいサブコマンドにエイリアスを設定できたります。
# だいたいこんな感じ
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.br branch
リポジトリを作る
Subversion でいう svnadmin create ですね。
git init --bare /path_to_repos/MyRepos.git
なくてもいけるのかどうかは分かりませんが、リポジトリのディレクトリ名は .git で終わるのが慣例のようです。
リポジトリのコピーをローカルに作成する
git clone [email protected]:/path_to_repos/MyRepos.git working_dir
git init で作ったベアリポジトリのコピーをローカルに作成します。ローカルにもリポジトリができる、というのは Subversion にはない概念ですが、あえて言うなら svn checkout と同様の役割と言えます。(ローカルリポジトリと一緒にバージョン管理されているソースコードも展開されるので)
今いるブランチのコピーを作成する
svn copy ですね。あくまでローカルリポジトリ内でコピーされるだけで、プロジェクト全体で共有されるものではありません。
git branch new_branch
リモートリポジトリからブランチをコピー、作成する場合は以下です。
git branch new_branch origin/new_branch
今いるブランチを切り替える
git checkout another_branch
最初これややこしかったー!svn checkout と全然意味違うんだもん!実際は svn switch と同じですね。
ちなみに -b オプションをつけると、git branch と git checkout を同時に実行してくれます。以下は、リモートから another_branch のコピーを作成して、そのまま切り替えちゃうコマンド例です。
git checkout -b another_branch origin/another_branch
コミット待ちに追加する
svn add と同じですね。唯一と言っていいほど全く同じです。-A オプションで全てのバージョン管理されていないファイルがコミット待ち状態になります。
git add -A
コミットする
Git でいうコミットはローカルリポジトリに対して変更点を記録するだけで、この時点ではまだ変更点は他のプロジェクトメンバーに共有されません。この辺りの概念も最初ややこしかった・・・。
git commit -a
マージする
例えば develop ブランチから分岐した nakamura ブランチで作業を進めて、ひとつの機能が完成したとします。これらの変更点を develop ブランチにマージするには以下のコマンドを実行します。
# develop ブランチに切り替え
git checkout develop
# nakamura ブランチをマージ
git merge nakamura
ローカルリポジトリに溜まった変更点をリモートリポジトリに適用
svn commit により近いのはこちらでしょうか。ちなみに『今いるローカルブランチの変更点』を『同名のリモートブランチ』に対して適用します。
git push
全部のブランチを push するには --all オプションをつければいいのかな?(やった事ないです)
リモートにある変更点をローカルに適用する
svn update ですね。
git pull
pull してきた変更点を作業中のブランチに適用する
一種のマージですが、厳密に言うと『ブランチの分岐点を一番新しいコミットに移動する』というようなイメージでしょうか。
# 作業中のリポジトリに切り替え
git checkout nakamura
# develop ブランチを取り込む
git rebase develop
よく使う基本的な機能はこんな所でしょうか。まだまだ Git 初心者なのでおかしな点ありましたら、バシバシ指摘してやってください~。
終わりに
Subversion ユーザ的に一番ややこしいのが、リモートとローカル両方にリポジトリがある事だと思います。リモートリポジトリとのやり取りは基本的に push と pull だけ、それ以外のコマンドは基本的にローカルリポジトリ内での出来事、という辺りが分かってくると大分使いやすくなってきます。
まぁ色々ややこしくて覚える事も多いけれど、それを補って余りある点がひとつ・・・。とにかく速いよ!!!