Technology Engineering

178inaba の技術ブログ

git mergeのとき、デフォルトでno-ffになるようにする設定

inabaです。

ブランチのマージ時にマージ対象のブランチでどんな変更があったか知るためにマージコミットが欲しいので--no-ff(No Fast-forward)オプションをつけていました。

$ git merge --no-ff foobar

ですが、設定でデフォルトをno-ffにできることを知りました。

設定

$ git config --global merge.ff false

上記設定をすることでgit merge foobarのみでno-ffのマージになります。

$ git merge foobar
...

$ git log --graph --oneline
*   f84d525 Merge branch 'foobar'
|\  
| * 2d68cba Fix B.
|/  
* a3159f3 Fix A.

参考サイト: Git - git-merge Documentation

問題

しかし、上記のみだとpull時もno-ffでマージコミットができてしまいます。

$ git pull
...

$ git log --graph --oneline
*   73018f7 Merge branch 'master' of github.com:178inaba/test
|\  
| *   f84d525 Merge branch 'foobar'
| |\  
|/ /  
| * 2d68cba Fix B.
|/  
* a3159f3 Fix A.

よく言われることですがpullというのはfetchとリモートブランチのmergeの組み合わせなのでリモートブランチをマージする時に上記no-ffの設定が適用されてしまいます。
これを防ぐためにpull時にはFast-forwardでマージするように設定します。

$ git config --global pull.ff only
$ git log --graph --oneline 
* c7356cb Fix C.

$ git pull
...

$ git log --graph --oneline 
* bdbb39c Fix D.
* c7356cb Fix C.

pullでマージコミットが作られないようになりました。

まとめ

$ git config --global merge.ff false
$ git config --global pull.ff only
$ cat ~/.gitconfig
[merge]
    ff = false
[pull]
    ff = only

今日はここまで。