エクスプローラで Git 操作ができるクライアントソフト TortoiseGit を用いて、リモートブランチによって更新したサブモジュールのリポジトリが detached HEAD になった際の対処例を紹介します。
ローカルのブランチに切り替え・チェックアウトする手順以外に、リモートブランチの最新コミットを参照するローカルのブランチを設定と、その確認の手順も紹介します。
※今回紹介するチェックアウト以外に、マージ(–ff-only)でも対処できるようです。

※ TortoiseGit-2.17.0.2-64bit を使用します。
前回の記事
前回は、TortoiseGit を用いて、追加したサブモジュールを対応するリモートリポジトリの最新の状態に更新するために模索した際の失敗例を紹介しました。
今回は、その後、サブモジュールのリポジトリが detached HEAD になったので、リモートブランチの最新コミットを参照するローカルブランチを設定します。
※サブモジュールに限らず、ローカルリポジトリのブランチ設定で有効だと思います。
detached HEAD のローカルリポジトリのブランチの設定
もしも、リポジトリの参照が detached HEAD (ブランチに属していない状態)だった場合は、ローカルのブランチ(例:refs/heads/develop)を割り当てます。
今回は、リモートリポジトリの最新のコミットを参照させるために、リモートのブランチをチェックアウトすると同時に、ローカルのブランチを作成 / 上書きして、ローカルのブランチを設定します。
Updates files in the working tree to match the version in the index or the specified tree. If no pathspec was given,
gitcheckoutwill also updateHEADto set the specified branch as the current branch.作業ツリー内のファイルを更新して、インデックスまたは指定されたツリー内のバージョンと一致させます。 pathspec が指定されていない場合、git checkout は HEAD も更新して、指定されたブランチを現在のブランチとして設定します。
Git – git-checkout Documentation と Google 翻訳
サブモジュールのローカルリポジトリのフォルダをエクスプローラで開いて、右クリックで表示されるメニュー「TortoiseGit」→「ref ブラウザ」で、ダイアログを開いて、ローカルのブランチの状態を確認できます。

「切り替え / チェックアウト」ダイアログで、最新の状態を持っているリモートのブランチ(例:origin/develop)を選択します。
※リモートの選択肢は、メニュー「TortoieseGit」→「設定」の「Git」→「リモート」のページで、リモート(名前)と URL を指定して作成できます。
※「切り替え / チェックアウト」ダイアログを表示するには、サブモジュールのフォルダをエクスプローラで開いて、右クリックで表示されるメニュー「TortoiseGit」→「切り替え / チェックアウト」を選択します。
自動的に「オプション」枠の「新しいブランチを作成」がチェックされ、同じ名前(例:develop)のブランチ名が提案されます。
すでに、そのブランチ名をローカルでも持っている際は、「既存のブランチがあれば上書きする」をチェックして上書きを許可します。
※上書きすると以前の同じ名前のブランチの情報が消えるので注意してください。
設定が済んだら OK ボタンを押します。

チェックアウトを行うと、サブモジュールのリポジトリは指定したリモートブランチ(例:origin/develop)の最新コミット状態に更新され、同時に作成・上書きされたローカルブランチ(例:develop)へ切り替わります。
git.exe checkout --no-track -B develop --end-of-options remotes/origin/develop --
M sc_fit_font_size_dialog.tscn
Your branch is up to date with 'origin/develop'.
Switched to and reset branch 'develop'
成功 (625 ms @ 2025/09/16 13:38:22)
Specifying
-bcauses a new branch to be created as if git-branch[1] were called and then checked out. In this case you can use the--trackor--no-trackoptions, which will be passed togitbranch. As a convenience,--trackwithout-bimplies branch creation; see the description of--trackbelow.If
-Bis given, <new-branch> is created if it doesn’t exist; otherwise, it is reset.-b を指定すると、あたかも git-branch[1] が呼び出されてチェックアウトされたかのように、新しいブランチが作成されます。この場合、 –track または –no-track オプションを使用でき、これらは git ブランチに渡されます。便宜上、-b を指定しない –track はブランチの作成を意味します。以下の –track の説明を参照してください。
-B を指定すると、<new-branch> が存在しない場合は作成されます。それ以外の場合はリセットされます。
Git – git-checkout Documentation と Google 翻訳
再び、サブモジュールで「ref ブラウザ」ダイアログを開いて、ローカルのブランチ(例:develop)を確認すると、リモートブランチ(例:origin/develop)と同じ最新のコミットを参照するように変わりました。
※「ref ブラウザ」ダイアログは、リポジトリのフォルダをエクスプローラで開いて、右クリックで表示されるメニュー「TortoiseGit」→「ref ブラウザ」で表示できます。
また、作業ディレクトリは、「強制」(–force) をチェックしなかったので変更されていません。

リモートリポジトリのフォルダで同様に「ref ブラウザ」ダイアログを表示すると、リモートブランチ(例:origin/develop)の最後のコミットも同じコミットであることが確認できました。

detached HEAD の状態でコミットしてしまった場合(失敗例)
コミットするサブモジュールにコミット先のブランチがない状態(detached HEAD) の場合は、ローカルのブランチを設定します。
例えば、リモートのブランチ(例:refs/remotes/origin/develop)をチェックアウトした場合は、ローカルのブランチからたどれないためこの状態になります。

以下のダイアログが出るので「キャンセル」ボタンで中止します。

---------------------------
TortoiseGit
---------------------------
現在の HEAD は切り離されており (Detached)、つまりブランチ無し (no branch) で作業しています。
ブランチを今作成しますか?
---------------------------
はい(Y) いいえ(N) キャンセル
---------------------------もしも、「いいえ」を選択した場合は、下図のリポジトリブラウザのように、ブランチから外れた(unreachable)コミットオブジェクトが履歴の最新に追加されます。
この状態のコミットオブジェクトは、一定期間、どのブランチの下にも置かない場合は、自動的に削除されるので注意しましょう。

まとめ
- ローカルリポジトリの detached HEAD の状態を、TortoiseGit の「切り替え / チェックアウト」ダイアログで、作成・上書きしたローカルのブランチに切り替えることで対処しました。
- リモートのブランチの最新コミットを参照するローカルのブランチを作成・上書きしました。
参照サイト Thank You!
- Git
- Git – git-submodule Documentation
- Git – サブモジュール
- Git – git-checkout Documentation
- TortoiseGit – Windows Shell Interface to Git
記事一覧 → Compota-Soft-Press

コメント