社長におねだりしたらベイスターズ買ってくれないかなぁ。どうもこんにちは nakamura です。
シーブレインでは今も昔もソース管理に Subversion を使い続けていますが、最近は協力会社さんとのやり取りなどで何かと Git にさわる機会が増えてきました。最初はチンプンカンプンでしたが、ようやく何となく基本的な部分が分かってきたので、Subversion ユーザ的な目線でちょこっと説明してみたいと思います。
コマンド例
初期設定
Git ではユーザ毎の設定内容も git コマンドで操作します。とりあえずいつも以下のような感じで設定してます。diff に使うコマンドとかも指定できるみたいですね。
# 名前 git config --global user.name "Tadashi Nakamura" # メールアドレス git config --global user.email nakamura@example.com # 色設定 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 username@example.com:/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 だけ、それ以外のコマンドは基本的にローカルリポジトリ内での出来事、という辺りが分かってくると大分使いやすくなってきます。
まぁ色々ややこしくて覚える事も多いけれど、それを補って余りある点がひとつ・・・。とにかく速いよ!!!