git submoduleのコマンドをよく調べるのでまとめてしまう

https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E3%82%B5%E3%83%96%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB

を参考にしています

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以外で追うイメージが浮かばないけど)