Git School · FluxGit

Git detached HEAD:离开前保留你的提交

FluxGit ·

这些代码块对应不同情况,不是一个完整脚本。请选择适合仓库的情况,并替换分支名、路径和VERIFIED_COMMIT。中止命令只适用于对应的正在进行的操作,不要执行两种备选方案。

简短答案

detached HEAD表示HEAD直接指向提交,而不是跟随本地分支。仍可检查、构建和提交。若想保留新工作,离开前在当前提交创建命名分支。分离检出本身不是损失;把新提交留在没有持久引用的位置才带来恢复问题。

示例与前提

例子是在旧版本上临时检出后产生两个需要保留的提交。它不同于正在进行的rebase或有意分离的submodule。先读status,若有进行中的操作,明确完成或中止,不要用本指南随意打断另一个流程。

修改前检查状态

普通分离状态下branch --show-current为空,status说明状态,log显示当前已提交历史。记录HEAD的ID。空名称不表示仓库没有分支或文件未被跟踪。引用位置和工作区内容回答不同问题。

git status
git branch --show-current
git log -3 --oneline
git rev-parse HEAD

保留引用或独立检出

仍在所需提交时,用switch -c创建rescue/detached。这保留提交及祖先的可达性,但不会把未暂存编辑变成提交。需要时另行审查并保存编辑。用新名称,不要用强制选项替换已有分支。

git switch -c rescue/detached
git branch --show-current

第一种操作

创建后检查分支名、提交与补丁。可继续工作,或通过merge、cherry-pick把选择的修复整合到其他分支。cherry-pick把更改复制到新提交,merge连接历史。按任务选择并验证结果。安全离开分离状态并不自动要求push。

git log -3 --oneline --decorate
git show --stat HEAD

有意选择另一种结果

若已离开,查看本地reflog并用show检查候选。根据补丁和父提交选定正确ID,再创建rescue/recovered。VERIFIED_COMMIT必须替换为已核实ID。后续操作会改变相关记录,因此HEAD@{1}不一定是丢失的提交。

git reflog --date=iso
git show VERIFIED_COMMIT
git branch rescue/recovered VERIFIED_COMMIT

限制与例外

reflog记录本地引用移动,不是远程档案。记录和不可达对象可能过期或被清理。未提交编辑从未以提交形式记录。若只丢失工作文件,寻找损失前已存在的编辑器备份或核实的stash,不要承诺reflog能重建任意未保存内容。

冲突与清理

submodule通常以detached HEAD检出父仓库固定的提交,仅使用依赖时这是正常状态。若要开发子仓库,在其内部创建自己的分支并遵循贡献流程。父分支不会自动命名子提交;两个仓库的引用和历史彼此独立。

验证结果

删除救援分支前,确认另一个持久分支或已审查合并仍可到达所需提交。检查目标状态和补丁,审查期间保留引用。分支名是已提交历史的句柄,不是所有文件的第二份物理备份,也不是测试成功证明。

git log --oneline --decorate rescue/detached
git status --short

常见问题

这是错误吗?有意检查提交、标签或固定submodule时不是。可以提交吗?可以,但离开前给要保留的历史命名。之后能恢复吗?对象和本地证据仍在时有可能;应检查候选,不能保证永久保留。

在FluxGit中审查操作

使用FluxGit的可视历史与差异视图审查操作及相关提交。保留本例中的分支、共享历史和本地文件检查。下载页面列出当前提供的版本及平台。

Git官方文档

相关操作

下载FluxGit