Git で fast-forward merge と non fast-forward merge の違いを体感する方法

結論

non fast-forward のマージ*1を延々と繰り返すとよい。

実例

master ブランチのコミット履歴が「A→B→C」とする。development ブランチのコミット履歴が「A→B→C→D」とする。このとき、以下のコマンドを繰り返すと master ブランチ と development ブランチ が永遠に追いかけっこをする。

$ git checkout master
$ git merge --no-ff development

$ git checkout development
$ git merge --no-ff master

$ git checkout master
$ git merge --no-ff development

$ git checkout development
$ git merge --no-ff master

$ git checkout master
$ git merge --no-ff development

$ git checkout development
$ git merge --no-ff master
(以下略)

fast-forward なマージ*2をすれば master ブランチ と development ブランチが「マージを行った時点で一致する」ため、追いかけっこができなくなって一件落着。

$ git checkout development
$ git merge master
Updating 4a7d861..348653d
Fast-forward

もちろん non fast-forward なマージを行った場合でも、その後に master ブランチ と development ブランチを手動で一致させれば問題はない*3

*1:git merge --no-ff ブランチ名

*2:merge コマンドのオプションを省略する

*3:けど、あんまりそれをする意味がないですよね

Powered by はてなブログ