关于 fix-git
fix-git 是用于诊断和恢复常见 Git 问题的技能,重点处理丢失的提交和 detached HEAD 中的工作。它说明恢复方案、安全步骤、冲突处理与结果验证。
主要功能
- 01检查仓库状态与 reflog
- 02通过 merge 或 cherry-pick 恢复提交
- 03恢复前创建安全分支
- 04处理并验证合并冲突
适用场景
- 01查找分支历史中缺失的提交
- 02恢复在 detached HEAD 中提交的工作
- 03找回意外 reset 后的工作
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ letta-ai/ skills --skill fix-git安装后在 Claude Code 中输入/fix-git确认已加载。
详细介绍
Git 恢复与修复技能
此技能提供系统化的方法,用于诊断和恢复常见的 Git 问题,尤其是提交丢失和分离的 HEAD 状态。
何时使用此技能
- 恢复看似“丢失”或缺失的提交
- 修复已提交工作但不在任何分支上的分离 HEAD 状态
- 从意外的
git reset或git checkout操作中恢复 - 在未提交的情况下切换分支后恢复工作
- 调查仓库中缺失的更改
诊断方法
初步评估
要诊断 Git 恢复问题,请并行运行以下命令以了解仓库状态:
git status- 检查当前工作目录状态和分支git reflog- 查看 HEAD 移动历史(查找丢失的提交时至关重要)git branch -a- 列出所有分支,包括远程分支git log --oneline -10- 查看当前分支上的近期提交历史
理解 Reflog 输出
reflog 是恢复时最重要的工具。它会显示 HEAD 曾指向的每个位置,包括:
- 在分离的 HEAD 状态下创建的提交
- 重置之前的位置
- 分支切换和检出操作
Reflog 条目的格式为:<commit-hash> HEAD@{n}: <action>: <message>
留意以下条目:
commit:- 创建了一个提交(可能是待恢复的目标)checkout:- 发生了分支切换(可能显示提交遗留的位置)reset:- 执行了重置(此时间点之后的提交可能需要恢复)
恢复策略
策略 1:合并丢失的提交
当提交存在于 reflog 中,但不属于任何分支时:
# First, ensure on the target branch
git checkout <target-branch>
# Merge the lost commit
git merge <commit-hash>
这会保留提交历史及其关系。
策略 2:挑选丢失的提交
当不希望合并,或只需要特定提交时,可采用此替代方案:
git checkout <target-branch>
git cherry-pick <commit-hash>
以下情况适合使用 cherry-pick:
- 只需要一系列提交中的特定提交
- 希望提交历史呈线性
- 合并会引入不需要的更改
策略 3:创建恢复分支
执行恢复操作前,先创建一个安全分支:
# Create a branch at the lost commit for safety
git branch recovery-<descriptive-name> <commit-hash>
# Then proceed with merge or cherry-pick
git checkout <target-branch>
git merge recovery-<descriptive-name>
如果恢复过程出错,这会提供一个回滚点。
策略 4:重置到丢失的提交
当需要将当前分支移动到丢失的提交时(请谨慎使用):
# Soft reset preserves changes in staging
git reset --soft <commit-hash>
# Mixed reset (default) preserves changes in working directory
git reset <commit-hash>
# Hard reset discards all changes (dangerous)
git reset --hard <commit-hash>
恢复过程中的冲突解决
处理合并冲突
合并恢复的提交时发生冲突:
- 找出冲突文件:
git status会显示存在冲突的文件 - 阅读冲突文件,了解两个版本的内容
- 寻找上下文线索:提交消息通常会说明意图(例如,“Move to Stanford” 表示哪个版本正确)
- 编辑以解决冲突:移除冲突标记并保留正确内容
- 验证解决结果:重新阅读文件,确认已移除所有冲突标记
- 完成合并:
git add <resolved-files> git commit
冲突标记格式
<<<<<<< HEAD
Current branch content
=======
Incoming commit content
>>>>>>> <commit-hash>
移除全部三行标记,并保留所需内容。
验证步骤
执行任何恢复操作后,请验证是否成功:
-
检查所有已修改的文件:恢复的提交修改了多个文件时,逐一检查
git show <commit-hash> --stat # See which files were modified -
验证文件内容:阅读恢复涉及的文件,确认内容正确
-
检查是否还有冲突标记:在已修改的文件中搜索
<<<<<<<、=======或>>>>>>> -
检查提交历史:
git log --oneline -5 -
如果有测试,则运行测试:执行任何测试套件以验证功能
常见陷阱
陷阱 1:未彻底解决冲突
问题:声称已解决冲突,但文件中仍残留冲突标记。
预防方法:编辑后务必重新阅读文件,确认所有标记均已移除。
陷阱 2:忽略自动合并的文件
问题:只关注存在冲突的文件,而忽略可能有问题的自动合并文件。
预防:使用 git show <commit-hash> --stat 查看恢复的提交修改了哪些文件,并逐一检查。
陷阱 3:未创建安全分支
问题:执行恢复操作时没有回滚点。
预防:在合并或重置之前,记下当前 HEAD 位置或创建一个分支:
git branch backup-before-recovery
陷阱 4:垃圾回收风险
问题:处于分离 HEAD 状态的提交,如果没有被分支或标签引用,最终可能会被垃圾回收。
预防:及时为重要提交创建分支:
git branch save-work <commit-hash>
陷阱 5:以为只丢失了一个提交
问题:可能有多个提交成为孤立提交,却只恢复最近丢失的提交。
预防:检查完整的 reflog,找出所有可能需要恢复的提交:
git reflog | head -20
决策框架
恢复丢失的工作时,请根据以下因素选择合适的方法:
| 情况 | 推荐方法 |
|---|---|
| 单个提交,希望保留完整历史记录 | git merge |
| 单个提交,希望保留线性历史记录 | git cherry-pick |
| 多个相关提交 | git merge 最新的提交(包含其祖先提交) |
| 多个不相关的提交 | 逐个对其执行 git cherry-pick |
| 不确定如何恢复 | 先创建分支,再合并 |
| 需要彻底移动分支 | git reset(谨慎使用) |
恢复后的最佳实践
成功恢复后:
- 记录发生的情况:了解原因有助于防止问题再次发生
- 检查是否存在类似问题:其他工作也可能成为孤立工作
- 考虑改进工作流:分离 HEAD 通常是因为执行了
git checkout <commit>,却没有创建分支