gitの使い方

先ほど研究室で質問されてこんなやり取りをしました:

「gitを勉強中だがよくわからない」
「どういうところが?」
「コマンドは理解したが、バージョンとかブランチとかをどう使ったらいいのか?」
「どういうことがしたい?」
「いまプログラムの派生版を複数のディレクトリにおいて並行作業している。これがgitを使うと上手に管理できると思うが?」
「できる。前のリビジョンのバックアップのつもりで使っているのなら複数のディレクトリは複数のリビジョンに対応する。方向性の違う拡張を別々のディレクトリで作業しているのであれば、それぞれのディレクトリはブランチに対応する」

「ブランチAの初期状態をA.1として、その改訂版A.2を作ってみたとする。やっぱりA.1に戻して、別の改良をしてみたくなったとする。そんなときには?」
「gitはCVSやSubversionと比較してブランチを簡単に作ることができる。gitを使う人はA.1でブランチを切って、A.2で失敗したと思ったらA.1のブランチに戻す、といったことが簡単にできるので、気軽にブランチを切るようだ」

「ブランチはたくさん作ってもよいのか?」
「個人的な意見として、実験的・一時的なブランチは不要になったら消去する、あるいは使用済みであることが容易にわかる名前にするのがよいのではないか」
「リビジョンはたくさん作ってもよいのか?」
「リビジョンはコミットするたびに増える。結果的にたくさんになる。ただしgitでは「一回に行うコミットにひとつのまとまった意味を与える」ことが推奨される。そのためにコミットする前の「ステージング」という段階で細かい調整ができる」

「バージョン管理システムはパッチを単位にリビジョンを管理していると理解したが?」
「gitではファイルごとにパッチを管理する感覚ではなく、「追加・変更される機能」を単位として「複数のパッチから構成されるチェンジセット」をリビジョンごとに追加していく。gitではこの「ステージに追加」「ステージをコミット」の2段階の操作が前提になっているので、ちょっととっつきにくい。同じような分散バージョン管理システムであるmercurialのほうがシンプルな印象」

「ブランチを作った場合の共同作業はどうなる?」
「git checkoutコマンドで作業ファイルそのものを切り替えてしまうので、ファイルサーバの上で自分の作業ファイルをそのまま他人に読ませるような共有は作業しにくい。gitでは他人の作業ファイルはgit cloneして自分用にリポジトリのコピーを作り、そこでブランチを切り替えて作業をするのがスマート」

「分散バージョン管理の運用上の注意は?」
「これも個人的意見だが、リポジトリをcloneするときに「どこに戻す必要があるリポジトリなのか」がわかるようにしておくとよい。git remote add で origin という名前をつける例をよく見る。個人的には親リポジトリのサーバ名を使う方が直感的。例えば git remote add github みたいにする」

「子リポジトリをおく場所にも気をつけている。例えば github というディレクトリの中には github.com から clone したプロジェクトを置く、など。究極的にはバージョン管理は「ある作業ファイルを安全に捨てることができるか、重要な改変を漏らさずマスターリポジトリに反映できるか」がポイントだと思う」

追記(2010-02-27) 「master という名前を」→ 「origin という名前を」に訂正。
追記(2010-03-09) mercurial (hg) を bazaar (bzr) と読み替えてもほぼ同じだと思いますが bzr についてもいずれ書きたいと思います。

Share