TortoiseGit detached HEAD になった際の対処例

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

TortoiseGit ダウンロードとインストール1

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, git checkout will also update HEAD to set the specified branch as the current branch.

作業ツリー内のファイルを更新して、インデックスまたは指定されたツリー内のバージョンと一致させます。 pathspec が指定されていない場合、git checkout は HEAD も更新して、指定されたブランチを現在のブランチとして設定します。

Git – git-checkout Documentation と Google 翻訳

サブモジュールのローカルリポジトリのフォルダエクスプローラで開いて、右クリックで表示されるメニュー「TortoiseGit」→「ref ブラウザ」で、ダイアログを開いて、ローカルのブランチの状態を確認できます。

TortoiseGit サブモジュールの変更のコミットとプッシュ2

「切り替え / チェックアウト」ダイアログで、最新の状態を持っているリモートのブランチ(例:origin/develop)を選択します。
※リモートの選択肢は、メニュー「TortoieseGit」→「設定」の「Git」→「リモート」のページで、リモート(名前)と URL を指定して作成できます。
※「切り替え / チェックアウト」ダイアログを表示するには、サブモジュールのフォルダをエクスプローラで開いて、右クリックで表示されるメニュー「TortoiseGit」→「切り替え / チェックアウト」を選択します。

自動的に「オプション」枠の「新しいブランチを作成」チェックされ、同じ名前(例:develop)のブランチ名が提案されます。
すでに、そのブランチ名をローカルでも持っている際は、「既存のブランチがあれば上書きする」チェックして上書きを許可します。
上書きすると以前の同じ名前のブランチの情報が消えるので注意してください。

設定が済んだら OK ボタンを押します。

TortoiseGit サブモジュールの変更のコミットとプッシュ3

チェックアウトを行うと、サブモジュールのリポジトリは指定したリモートブランチ(例: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 -b causes a new branch to be created as if git-branch[1] were called and then checked out. In this case you can use the --track or --no-track options, which will be passed to git branch. As a convenience, --track without -b implies branch creation; see the description of --track below.

If -B is 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) をチェックしなかったので変更されていません。

TortoiseGit サブモジュールの変更のコミットとプッシュ4

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

TortoiseGit サブモジュールの変更のコミットとプッシュ5

detached HEAD の状態でコミットしてしまった場合(失敗例)

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

TortoiseGit サブモジュールの変更のコミットとプッシュ13

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

TortoiseGit サブモジュールの変更のコミットとプッシュ14
---------------------------
TortoiseGit
---------------------------
現在の HEAD は切り離されており (Detached)、つまりブランチ無し (no branch) で作業しています。
ブランチを今作成しますか?
---------------------------
はい(Y)   いいえ(N)   キャンセル   
---------------------------

もしも、「いいえ」を選択した場合は、下図のリポジトリブラウザのように、ブランチから外れたunreachableコミットオブジェクトが履歴の最新に追加されます。
この状態のコミットオブジェクトは、一定期間、どのブランチの下にも置かない場合は、自動的削除されるので注意しましょう。

TortoiseGit サブモジュールの変更のコミットとプッシュ15

まとめ

  • ローカルリポジトリの detached HEAD の状態を、TortoiseGit の「切り替え / チェックアウト」ダイアログで、作成・上書きしたローカルのブランチに切り替えることで対処しました。
  • リモートのブランチの最新コミットを参照するローカルのブランチを作成・上書きしました。

参照サイト Thank You!

記事一覧 → Compota-Soft-Press

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました