git submoduleのコマンドをよく調べるのでまとめてしまう
を参考にしています
1. 初期化する
git submodule init
2. 更新する
git submodule update
1, 2を合わせて
git submodule update --init
3. diffが意味不明
yoan $ git diff
diff --git a/submodule b/submodule
index aaaaaaaaaa..bbbbbbbb 160000
--- a/submodule
+++ b/submodule
@@ -1 +1 @@
-Subproject commit aaaaaaa...
+Subproject commit bbbbbbb...
diff差分がよくわからないときは--submoduleオプションを追加する
yoan $ git diff --submodule
Submodule /submodule aaaaaaaaaaa..bbbbbbbbbbb (rewind):
< Merge pull request #2 from hogehoge
defaultで有効化もできる
yoan $ git config --global diff.submodule log
4. 間違ったcommitになってしまう
この記事を書こうと思った本命。
3の例でdiffに(rewind)が出ている (rewindは巻き戻りという意味)
実際、originではaaaaaaaaaaaが最新なのになぜかlocalでは一つ前のbbbbbbbbbbに変えようとしている
この状態が何故起こったのかはよくわからないがsubmodule updateをしても無駄だった
4.1 fetchとmerge
こうなった場合、該当するsubmoduleでfetchとmergeをすると治る
cd submodule
git fetch
git merge
4.2 update –remote
しかし巻き戻りでは4.1の方法では直らなかった
git submodule update --remote submodule-name
これで直った こちらの場合、submoduleのパスに入る必要もないので、こっちを使うほうが良さそう
なお、このコマンドはデフォルトでは、サブモジュールのリポジトリの master ブランチの内容まで手元にチェックアウトした内容を更新する、という前提で動作します。
なので込み入った運用はできないっぽい (あまりsubmoduleをmaster以外で追うイメージが浮かばないけど)