ローカルにGitリポジトリがあり、そのサブモジュールがプル時に一時ブランチになっている。私はその一時ブランチでいくつかのコードをコミットし、その後サブモジュールをmain
ブランチに戻した。しかし、これらのコミットされたコードが見つからず、main
ブランチで見つけることができない。また、その一時ブランチの履歴も見つけられない。
ソリューション
Git サブモジュールで一時的なブランチにコミットし、main
ブランチに戻すとこれらのコミットが見つからなくなることがあります。この状況を解決するには、以下の手順に従ってください。
- コミット履歴の確認: サブモジュールのディレクトリに移動し、reflog を使用して失われたコミットを見つけます。
- 新しいブランチを作成してコミットを保存: 失われたコミットに基づいて新しいブランチを作成します。
- メインブランチへのマージまたはcherry-pick: コードをメインブランチに統合します(マージするか、cherry-pickを使用して特定のコミットを選択)。
以下は具体的な操作手順です。
# サブモジュールのディレクトリに移動
cd path/to/your/submodule
# reflog で HEAD の変更履歴を確認(未関連ブランチのコミットも含む)
git reflog
PS F:\dev\notebook\scripts\hugo-content-suite> git reflog
de05175 (HEAD -> main, origin/main, origin/HEAD) HEAD@{0}: checkout: moving from c8d070651310e90d283cb64d98da088c5fe05e73 to main
c8d0706 HEAD@{1}: commit: feat: Markdown 記号の用法ドキュメントを追加、詳細な構文例と効果のデモを提供
48250f5 HEAD@{2}: commit: feat: 文章翻訳プレビュー機能を削除し、翻訳プロセスを簡素化
b8280b6 HEAD@{3}: commit: feat: 絶対パスを取得する機能を追加し、相対パスを絶対パスに変換をサポート
92c354b HEAD@{4}: commit: fix: 文章スキャンロジックの修正、絶対パスを使用してスキャンするようにする
de05175 (HEAD -> main, origin/main, origin/HEAD) HEAD@{5}: checkout: moving from main to de05175d4ec0828e3ae95d726b09dfff18f67a23
de05175 (HEAD -> main, origin/main, origin/HEAD) HEAD@{6}: clone: from https://cnb.cool/ttf248/hugo-content-suite.git
# 失われたコミットに基づいて新しいブランチを作成(例:456def を使用)
git checkout -b saved-work 456def
# メインブランチに戻る
git checkout main
# 保存した作業をメインブランチにマージ(または cherry-pick で特定のコミットを選択)
git merge saved-work
# または
git cherry-pick 456def
# 親プロジェクトディレクトリに戻り、サブモジュールの更新をコミット
cd ..
git add path/to/your/submodule
git commit -m "Update submodule to include new changes"
主要操作手順
- git reflog: HEADのすべての履歴を表示し、ブランチに関連付けられていないコミットも含む
- git checkout -b: 任意のコミットから新しいブランチを作成し、作業を保存する
- git merge/cherry-pick: 保存されたコミットをターゲットブランチに統合する
reflogで記録が見つからない場合は、
git fsck --lost-found
を使用して孤立したコミットを探す必要があるかもしれませんが、これは非常にまれなケースです。