2014年3月13日木曜日

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

gitを用いてローカルリポジトリで開発する際の1つの手法として、ローカル専用ブランチを切って、変更を自分の名前のブランチにmerge --squashで反映する方法を以前紹介しました。

そして、自分の名前のブランチを中央リポジトリへとブッシュし、中央リポジトリへの管理者が各開発者の名前のブランチからmasterブランチにマージするわけですけれども、その際、masterブランチに各開発者の名前のブランチの変更を反映する時には、常にfast-forwardのマージを避けて--no-ffでマージしています。

これはなぜかというと、各開発者の行った変更・修正がどのタイミングでmasterブランチに統合されたのかを明確に記録するためです。

また、コミットグラフを見た際にも、開発者の名前がついたブランチが1直線につながるので綺麗に見えるという利点もあります。

例をお見せしましょう。EclipseのEgitプラグインでコミットグラフを見てみるとこんな感じに見えます。


上の図で、一番左の線がローカル専用ブランチ、真ん中の線が開発者の名前のブランチ(tkasai)、一番右の線がmasterブランチです。
※上から2番目のコミットだけmasterのグラフが左に行ってますが、脳内で右に位置を替えてみてるとすっきりします。

真ん中の線のtkasaiブランチへのコミットは、左の線のローカル専用ブランチ(local/日付)をmerge --squashでまとめたものです。例えば、真ん中あたりのコミットID:689b51aはコミットID:6e1b3b7〜60f3d8e(つまりlocal/14.02.18ブランチにおけるコミット)をまとめたものになっています。そして、tkasaiブランチを任意のタイミングでmasterブランチへと--no-ffでマージしています。ここではローカル専用ブランチをmerge --squashした直後が多いですね。

こうしてみると、いつmasterにどのブランチをマージしたのかが明確にわかります。

ちなみに、Egitのコミットグラフは現在のブランチに直接つながりのないブランチを隠すことができます。するとこうなります。今度は左の線がmaster、右の線がtkasaiで、さっきの図と位置が逆になっているので注意。


スッキリして見えますよね。最新以外のローカル専用ブランチが省略されてこうなるのです。まだ開発者ブランチが僕一人の分しか無いからこれだけですが、もっと開発者が増えたら、コミットグラフが整理されて見える恩恵はもっと大きくなると思います。

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

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

0 件のコメント:

コメントを投稿