Edited at
DiverseDay 7

gitのmerge --no-ff のススメ

More than 1 year has passed since last update.

2015年も終わりになって、gitの基本的な使い方の話に更なる需要があるとは思っていないのですが

本日が私のAdventCalender担当日であることと、本日偶然遭遇したトラブルの都合上、もしかしたらまだ需要が微レ存かもしれないと思い記事を書いていきたいと思います。


まとめ

git config --global --add merge.ff false

git config --global --add pull.ff only

皆しとくといい。


git のデフォルト設定はどうなっているか

gitはデフォルトではmergeコマンドを使った際に、mergeコミットを発生させる必要がない場合mergeコミットを発生せずにmergeを行うfast-forwardでのmergeを行うようになっている。

--no-ffというオプションを付けることで意図的にfast-forwardを行わないコミットをすることが出来る。


どういうトラブルが起こるか

仮にmasterにtopicAブランチをmergeしたとする。


  • fast-forwardであるmergeの場合mergeのコミットが発行されないため、masterがその後更新されていった場合にtopicAブランチで行われた作業を参照するのが面倒になる。

  • mergeの取り消しを行いたいと思った場合かなり面倒。


mergeコミットが存在すると?


  • mergeコミットのdiffを見るだけでそのブランチで行われた作業を見るのが容易

  • mergeコミットを取り消すことでmerge作業自体をなかったことにしたい場合も簡単


というわけで

--no-ffでmergeしよう

作業ブランチの用なブランチ特定の意味を持たない場合は、fast-forwardのmergeでも全く問題ないと思っています。


設定に入れて自動化しよう

毎回 --no-ff と付けてmergeするのは面倒だし忘れることもあります。

git config --global --add merge.ff false

を実行することで、デフォルトの設定を書き換え、指定無しでmergeを行った場合に--no-ffのmergeを行うことが出来るようになります。

また、--ffを付けることで意図的にfast forwardなコミットを行うことも可能です。


mergeだけ自動化した時に起こる問題


  • pullを行った時に行われるmergeにも--no-ffが有効になるため、pullを行う度にmergeコミットが発行されてコミットログが荒れる

  • Macのbrewの用なgitで管理されているシステムを利用した場合に、mergeコミットを発生させてしまう。


pull の時は除外しよう

pull の時は--no-ffオプションを使わないようにしましょう

git config --global --add pull.ff only

と実行することで pullの時はfast forwardが可能な時はfast forwardでmergeを行ってくれるようになります。


再度まとめ

git config --global --add merge.ff false

git config --global --add pull.ff only

皆しとくといい。