2014年2月19日水曜日

gitでローカルリポジトリにローカル専用ブランチを作って開発する

ソースコード管理はgitがもはや標準になっているけれど、ブランチの管理方法は人やプロジェクトによって様々だと思う。今回は、僕が現在採用してる方法を紹介したい。

想定として、中央リポジトリに各開発者がプッシュしていく、ハブ型の構成としよう。中央リポジトリにプッシュする際のブランチは、各開発者の名前(もしくは開発者を区別できる文字列)をつけたブランチとし、中央リポジトリの管理者が、各開発者の名前のついたブランチをmasterブランチにマージすることにする(だから各開発者はmasterにマージしない)。

※2014/03/13追記:ちなみに、masterにマージする際は--no-ffでしたようがよいのだが、それについては別の記事を書いた→ gitでmasterブランチへのマージを --no-ff で行う理由(コミットグラフ例つき)

さて、ここで各開発者は自分の名前のついたブランチ上で開発を行うわけだけれども、ここでコミットの頻度・タイミングをどうするかで悩むことになる。要するにこういうことだ。

  • コミットを細かく行ったほうが開発者としては状態を細かく保存でき、保存した状態からソースコードを比較できて開発を進めやすいし、作業失敗した時の保険にもなって安心だ。しかし、一度行った変更を更に変更したりあるいは戻したりすることも日常茶飯事であり、要するに細かく行ったコミットは「汚い」。中央リポジトリにプッシュする際にそのコミットは見せたくないし、masterブランチにマージする中央リポジトリ管理者も作業しにくいだろう。そしてmasterブランチのコミットログが大変見づらくなる。
  • コミットをまとまった機能ができたタイミングなど、ある程度大きい変更単位にすれば、コミットでの変更目的が分かりやすいし、開発途中での紆余曲折や変遷をいちいち記録しないのでコミットもすっきりする。中央リポジトリの管理者も楽だろう。masterブランチのコミットログも見やすい。ただし、開発者としては作業しづらいし何かあった際に作業内容が吹っ飛ぶ危険性もある。

じゃあどうするのかという話だけれど、僕が採用している方法は、
  • ローカルリポジトリにローカル専用のブランチを作る。
  • 中央リポジトリへプッシュするブランチは、ローカル専用ブランチからmarge --squashで変更を反映する。
  • marge --squashを行った後のローカル専用ブランチはそのまま残し、新たに別のローカル専用ブランチを切る。
というものだ。
ローカルリポジトリには、master、自分の名前、local/作成日付という名前で3種類のブランチを用意する。例えば、master、kasai、local/14.02.19という名前でブランチを作成したとしよう。


作業はlocal/14.02.19ブランチ上で行う。ここでのコミットは汚くなることを気にせず行っていい。例えば何回かコミットした状態としよう。


ここで、ある程度まとまった機能ができたとしよう。中央リポジトリへここまでの変更を1つのコミットとして提出することにする。まず、自分の名前のブランチ(kasai)へ移動する(git checkout kasai)。なお、EclipseのEgitだと太字が現在のブランチを表すので、移動しているのが分かる。


そして、先程まで作業していたローカル専用リポジトリの変更をmerge --squashで取り込む。(git merge --squash local/14.02.19)
変更を取り込んだら、git diff local/14.02.19を実行し、local/14.02.19とワーキングツリーが同じ内容になったことを確認し、git status で変更がインデックスに記録されたことを確認する。その後 git commit でコミットする。
コミットの際は自動的にそのコミットをまとめたコミットなのかコメントがデフォルトで入っているが、さらにコミットの要約文と、どのブランチのコミットをまとめたのかを書いておくといいだろう(この場合 local/14.02.19)。


これで自分の名前のブランチ(kasai)にローカル専用ブランチの変更を取り込めた。git diff kasai local/14.02.19 を実行し、同じ内容であることを確認しておこう。


開発を継続する時は新たにローカル専用ブランチを作成してそちらで作業する。(例えば git checkout -b local/14.02.20)


これを繰り返していくわけだ。新しく作ったローカル専用ブランチに何回かコミットするとこんな感じ。


ある程度まとまったら先ほどと同様にmerge --squashで自分の名前のブランチ(kasai)へ反映する。


さて、いかがだろうか。これで中央リポジトリのコミットログを汚なくせずに、なおかつ手元で細かくコミットを行って開発できる。ローカル専用ブランチ(local/...)が沢山できるけれど、気にならないならそのままにしておいてもいいし、ある程度時間が経ったら古いものは消してもいいだろう。

関連記事:gitでmasterブランチへのマージを --no-ff で行う理由(コミットグラフ例つき)

※この記事について指摘・意見・提案・感想などありましたら下のコメント欄にどうそ。

0 件のコメント:

コメントを投稿