メインのgitリポジトリにgitサブモジュールがあります。私が理解しているように、メインレポジトリはSHA値(どこか...))を格納し、「リンク」されているサブモジュールの特定のコミットを指します。
サブモジュールに行き、git checkout some_other_branch
と入力しました。どのコミットから来たのかわかりません。
メインリポジトリとサブモジュールが再び同期するように、そのポインターを元に戻したいと思います。
私の最初の(おそらく素朴な)本能はgit reset --hard
と言うことでした-それは他のすべてのために働くようです。驚いたことに、このシナリオでは機能しませんでした。
だから私はgit diff
を入力できることを理解し、サブモジュールポインターが持っていたSHA IDに注意し、サブモジュールとgit checkout [SHA ID]
...簡単な方法?
まだgitサブモジュールについて学んでいるので、わからない概念を表す言葉があれば、用語を修正してください。
サブモジュールを更新して、親リポジトリが本来あるべきものと同期するようにします。これが更新コマンドの目的です。
サブモジュールのマンページから:
登録されたサブモジュールを更新します。つまり、欠落しているサブモジュールのクローンを作成し、 リポジトリのインデックスで指定されたコミットをチェックアウトします。これにより、 -rebaseまたは--mergeが指定されているか、キーsubmodule。$ name.update がrebaseに設定されていない限り、サブモジュールがHEADから切り離されます。またはマージします。
これを実行すると、すべてがうまくいくはずです:
git submodule update
サブモジュールが指すコミットを変更するには、サブモジュールでそのバージョンをチェックアウトしてから、含まれているリポジトリに戻り、その変更を追加してコミットする必要があります。
または、サブモジュールをトップレポが指すバージョンに配置する場合は、git submodule update --recursive
を実行します。クローンを作成したばかりの場合は、--init
を追加します。
また、サブモジュールコマンドなしのgit submodule
は、指定しているコミットを表示します。同期していない場合、コミットの前に-または+があります。
サブモジュールが含まれているツリーを見ると、サブモジュールがcommit
としてマークされていることがわかります。これは、ブロブまたはツリーである残りの部分とは対照的です。
特定のコミットがサブモジュールを指すことを確認するには:
git ls-tree <some sha1, or branch, etc> Submodule/path
ログなどに渡すことで、コミットなどを表示できます(gitコマンドレベルのgit-dir
オプションを使用すると、サブモジュールに移動する必要がありません)。
git --git-dir=Submodule/path log -1 $(<the above statement>)
つかいます git ls-tree HEAD
「スーパープロジェクト」フォルダーで、サブモジュールの元のコミットを確認します。次に、サブモジュールのディレクトリに移動して、git log --oneline --decorate
元のコミットのブランチを確認します。最後に、 git checkout original-commit-branch
。
私がセットアップしたいくつかのテストディレクトリを使用して、コマンドは次のようになります。
$ git --version
git version 1.7.4.1
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: sm2 (new commits)
#
no changes added to commit (use "git add" and/or "git commit -a")
$ git ls-tree HEAD
100644 blob 76813a07ae558db274cefc6d903ec24323fdeb0d .gitmodules
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 main
160000 commit 7c5889497938cd5699a9234a98ee93947e52b1ed sm1
160000 commit f68bed61cba6f94cef57554f2cf46a45a4a0d337 sm2
$ cd sm2
$ git log --oneline --decorate
5b8d48f (HEAD, foo1) foo1.1
f68bed6 (Origin/master, Origin/HEAD, master) Initial commit.
$ git checkout master
Switched to branch 'master'
$ cd ..
$ git status
# On branch master
nothing to commit (working directory clean)
「スーパープロジェクト」には、コミット時のsm2サブモジュールが表示されますf68bed6
がsm2にはHEAD at 5b8d48f
。サブモジュールのコミットf68bed6
には、サブモジュールディレクトリのチェックアウトに使用できる3つのブランチがあります。
偶然出会ったもう1つのケースは、破棄したいサブモジュールにステージングされていない変更がある場合です。 gitサブモジュールの更新は、その変更を削除しませんし、親ディレクトリのgit reset --hardもしません。サブモジュールディレクトリに移動して、git reset --hardを実行する必要があります。したがって、親モジュールとサブモジュールの両方でステージングされていない変更を完全に破棄する場合は、次のようにします。
親で:
git reset --hard
git submodule update
サブモジュール内:
git reset --hard
ここでの答えは、どういうわけかサブモジュールに関する私の特定の問題を解決しなかったので、それがあなたにも起こった場合、以下を試してください...
git submodule foreach git reset --hard
https://kalyanchakravarthy.net/blog/git-discard-submodule-changes/
私はサブモジュールと私のモジュールの変更も無視したかった
以下のコマンドは私を助けました:
gitサブモジュール更新--init --recursive