Git子模块递交记录丢失

本地有一个 Git 仓库,其中的子模块在拉取时处于一个临时分支。我在该临时分支上提交了一些代码,随后将子模块切换回了 main 分支。然而,这些提交的代码似乎丢失了,无法在 main 分支中找到。我也找不到那个临时分支的记录。

解决方案

在Git子模块中提交到了临时分支,切换回main分支后找不到这些提交。这种情况可以通过以下步骤解决:

  1. 确认提交记录:进入子模块目录,查看reflog找到丢失的提交
  2. 创建新分支保存提交:基于丢失的提交创建新分支
  3. 合并或 cherry-pick 提交到 main:将代码整合到主分支

下面是具体的操作步骤:

# 进入子模块目录
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

# 切换回main分支
git checkout main

# 将保存的工作合并到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"

关键操作说明

  1. git reflog:显示HEAD的所有历史记录,包括未关联到分支的提交
  2. git checkout -b:从任意提交创建新分支,保存你的工作
  3. git merge/cherry-pick:将保存的提交整合到目标分支

如果reflog中找不到记录,可能需要尝试使用git fsck --lost-found查找 orphaned commits,但这种情况比较少见。

Licensed under CC BY-NC-SA 4.0
最后更新于 2025年06月02日 17:02
金融IT程序员的瞎折腾、日常生活的碎碎念
使用 Hugo 构建
主题 StackJimmy 设计