merge されない差分がある件

どういった経緯でなのかは分からないのですが、master branch と開発用 (develop という名前) branch の間で差分があるにも関わらず merge では無視される事象が発生しています。後天性記憶不全なのかなんとなくそうなっていたのかも最早分からず。
で、そのままスルーしてたんですが、この状態を意図的に作る必要が出てきていてようやく調べはじめていたりするあたりがまたアレ。

試験してみた

むむむ、と言いつつ clone して試してみたら conflict してるしorz
とは言え、conflict していない部分もあります。前提を列挙してみて色々確認してみます。

前提

  • 基本的に master は develop で発生した差分を merge したい

あら、つーことはさっき発生した conflict を都合よく解決してみるとどうなるのか。つまり

  • master を develop に merge
  • 発生した conflict は develop に都合の良い形で修正して commit
  • master に develop を merge してみる

これは駄目でした。master に develop を merge した時点で develop に都合の良いソレが採用されました。

develop を都合の良い形で merge してからは master と merge しても大丈夫、というか差分はあるけれど merge はスルーされる形になりましたね。あらら、って思ったら master 側が微妙な事になってました。もっかい最初から確認します。
リトライしてみたところ

  • master に develop を merge
  • conflict 発生を master 都合で修正

という処理を経て branch 間で diff すると差分はあるけれど、merge すると up-to-date になる、という状態を作ることができました。

これを踏まえて整理してみるに

  • 基本的に master と develop の先祖は同じ
  • develop に盛り込んだ修正を master に merge するが master には基本的に修正は入らない前提
  • とは言え、master と develop が完全に同一になる訳ではない
    • 例えば接続するサーバの URL とか
    • アレゲな定数値だったり

で、新規に master に固有な修正 (あるいは develop に固有な修正?) が生じる場合、以下な方法で収束できるはず。

  • develop では Issue を Fix した修正を入れる
  • master において Fix とは少々異なる修正を入れる
    • 例えば develop では表示するけれど、master では表示しない的ソレ
  • develop を master に merge するも conflict 発生
  • master 都合な修正で conflict を解決

これで以降はこの差分はスルーされるだろう、がその方法、って事で良いのかな。3-way merge のアルゴリズム、という観点で言うと conflict を解決した差分の残ったままな merge commit が共通祖先になって、以降の差分が merge 対象になる、という理解で良いのかどうか。
そういった意味では逆の merge (master を develop に merge) はしない方が良いのだな。もう少し複雑な修正を入れてみて確認してみます。

conclusion

以下で良いのかどうか。

  • master は develop からのみ merge される関係
  • develop の差分を無視したい場合、あるいは master 固有の修正を盛り込む場合は conflict させて develop の差分を無視する形で merge すれば良い

差分はあるのだけれど、共通祖先になる、というのがまた良いですね。素晴しい。

ちなみに

理解に微妙な部分がある場合、ご指摘頂ければ助かります。