見出し画像

Git_Fast-Forward Mergeとは #453

前回まとめていて、表題部分についても理解が甘いことが分かったので今回整理します。

Fast-Forward Mergeとは

ブランチをマージする際にマージコミットを発生させず、HEAD位置の変更(先に進んでいる方に合わせる(=早送り))だけを実行する方法です。

以下のように、現在のブランチが指すコミットが、マージするブランチのベース(共通の祖先)コミットであり、かつその間に他のコミットがない場合に実行されます。

○ = Commit
◎ = HEAD

○ -- ○ -- ○                 (master)
            \
              ○ -- ○ -- ◎   (feature)

この場合、単純にブランチのポインタを最新のコミットに「早送り」するだけで済み、マージコミットを作成せずにブランチを最新化する最もシンプルな形式となります。

ちなみに以下のように間に他のコミットが存在する場合、マージコミットが作成されます(non-fast-forward merge)。

○ = Commit
◎ = HEAD

○ -- ○ -- ○ ------ ◎        (master)
            \
              ○ -- ○ -- ○   (feature)

Fast-Forward Mergeの例

ではどのような場面でfast-forward mergeとなるか、具体的に例示してみます。

一番乗りでmaster (main) ブランチを更新するとき

表現にやや語弊がありますが、通常、チーム開発ではmaster (main) ブランチから作業ブランチを切って、開発が完了したらmasterへマージすると思います。

自分の作業ブランチを切ってから、自分を含めて誰もmasterへコミットしていなければ、上記の状態に該当してFast-Forward-Mergeになります。

git pullでブランチを最新化するとき

git pullはリモートリポジトリから最新の変更をフェッチして、ローカルリポジトリの現在のブランチにそれらの変更を統合するプロセスです。これは git fetch に続く git merge のショートカットとして機能します。

git pullする際、ローカルのブランチで何もコミットしていなければ、Fast-Forward-Mergeになります。

git rebaseしてからマージするとき

git rebaseは、あるブランチの変更を別のブランチの上に「再適用」するもので、これによって分岐がなくなり、直線的なコミット履歴が作成されます。リベース完了後にそのブランチをマージすると、fast-forward merge が可能になります。

git checkout feature
git rebase main
git checkout main
git merge feature

Fast-Forward Mergeのデメリット

fast-forward mergeはコミット履歴がシンプルになるというメリットがありますが、一方でマージコミットしないと作業履歴が見にくくなったり、コミットの修正等がやりにくかったりとデメリットも存在します。

そのような場合、以下のように--no-ff オプションを使用して強制的にマージコミットを作成することが可能です。

git merge --no-ff

--no-ff オプションを使うと、以下のようにマージコミットされます。

○ = Commit
◎ = HEAD

○ -- ○ -- ○ --------------- ◎   (master)
            \             /
              ○ -- ○ -- ○       (feature)


ここまでお読みいただきありがとうございました!

参考


この記事が気に入ったらサポートをしてみませんか?