• ..

React

    Submodule 同士でコンフリクリしたときの解決方法

    fooという名前の Submodule があるとします。
    そして、aブランチでは aaaaaa が最新 、bブランチでは bbbbbb が最新の Submodule があり、どちらもmaster ブランチから切ったあと Submodule 情報が更新されている状態だとします。

    このとき、恐らくaブランチのマージはすんなりできますが、その後bを取り込もうとした時にコンフリクトが起こるのではないかと思います。
    Submodule 周りのコンフリクトは GitHub 上のプルリクエストページ上では解決できずローカルで解決するしかないので少し複雑です。

    以下の方法は僕が色々試した結果なのでベストではないかもしれません。誰か詳しい人がいたら@nju33まで教えてください。

    Submodule 同士のコンフリクトを解消する

    問題の Submodule を削除する

    一度消してしまいます。以下で Sumodule ディレクトリを削除すると.gitmodulesからも消えます。

    git rm foo

    問題の Submodule を再度設定する

    これは追加するときと同じですね。

    git submodule add [-b BRANCH_NAME] foo <GIT_URL>

    Submodule 側のあるコミットを HEAD に指定したい

    もし、コミットを指定したものに変えたいなら以下でできます。

    #1つしかない、または全部
    git submodule foreach git reset --hard <COMMIT_HASH|TAG_NAME|branch>

    このブランチだけ指定したいんだという場合は以下でできます。その Submodule のルートディレクトリを見て、「BRANCH_NAMEが入っていれば HEAD コミットを変える」ということをしています。こちらももっといい方法があれば@nju33に教えてください。

    git submodule foreach sh -c 'if echo `git rev-parse --show-toplevel` | grep <BRANCH_NAME> > /dev/null; then git reset --hard <COMMIT_HASH|TAG_NAME|branch>; fi' 

    ちなみにここで間違えた場合は以下で戻しましょう。

    git submodule update --init