Git における、有名なブランチの運用モデルのひとつに、 "A successful Git branching model" (日本語訳) というものが存在する。
内容については、「サルでもわかる Git 入門」さんの、以下の解説がわかりやすい。
上記のブランチの運用モデルを簡単に行うための git-flow 拡張が存在し、 Git for Windows 2.5.3 以降に標準で同梱されている。
また、 Git GUI クライアントの SourceTree では、 上記の git-flow が使いやすい UI にまとめられている。
そんな便利な git-flow だが、あるときふと気づいたら、私の手元の環境でうまく動かなくなってしまっていた。
具体的には、
リリースブランチ を完了させた場合、
本来であれば、以下のように release/*
の内容が master
と develop
ブランチにマージされて タグが作成されるはずが、
なぜか master
ブランチにマージされずに、 変な場所に タグ が作成されてしまう。
リリースを完了させた時だけではなく、ホットフィックスを完了させた場合も同様になる。
不便きわまりない!
原因は 身に覚えのない git config の設定
git-flow した際のログを見てみると、以下のようになっている。
sh.exe gitflow_local\gitflow\git-flow release finish v0.0.0 Switched to branch 'master' Automatic merge went well; stopped before committing as requested M test.txt Switched to branch 'develop' Merge made by the 'recursive' strategy. test.txt | 1 + 1 file changed, 1 insertion(+) Deleted branch release/v0.0.0 (was 73008d1).
どうも、 master ブランチにチェックアウトした後、 マージが完了しないまま develop ブランチにチェックアウトされているくさい。
この Automatic merge went well; stopped before committing as requested
というメッセージは、 git merge
したときに --no-commit
オプションが指定された場合のもののようだ。 これが指定されていると、マージした際に (ステージされるだけで) コミットされないもよう。
なぜ develop ではマージがコミットされているのに、 master ではコミットされないのか。
いろいろ調べていると、 git config の設定を使って、安全のため 「master 上で git merge するときは常に --no-ff」 するというテクニックが存在することに気づく。
なんか、これくさい。
ためしに、 git config -l
で 設定の一覧を取得してみると、
branch.master.mergeoptions=--no-commit --no-ff
あった!!!
git config --unset branch.master.mergeoptions
で設定を削除すると、 冒頭の問題が発生しなくなった。
原因は不明
しかし、このような設定を最近行った覚えがないのが、すこぶる気持ち悪い…
最近 git config の設定に関係しそうな事柄と言ったら 何かをインストールしたとき だろうけれど、 Visual Studio 2015 か、 Visual Studio Code か、 はたまた なにかの npm モジュールか…
結局原因はわからず仕舞いだった。