研发协作
用高级 Git 操作清理历史、定位 bug 与恢复误删提交
在需要整理提交历史、跨分支挑选提交、二分定位引入 bug 的提交、并行开发多分支或从 Git 误操作中恢复时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
用高级 Git 操作清理历史、定位 bu通用
解决思路
- 交互式 rebase 编辑历史:用 git rebase -i HEAD~5 处理最近 5 个提交,用 git rebase -i $(git merge-base HEAD main) 处理当前分支全部提交,用 git rebase -i abc123 变基到指定提交;操作指令包括 pick(保留)、reword(改提交信息)、edit(修改提交内容)、squash(合并到上一提交并保留信息)、fixup(合并但丢弃信息)、drop(删除提交)。
- 用 cherry-pick 跨分支应用特定提交:git cherry-pick abc123 挑单个提交,git cherry-pick abc123..def456 挑一段提交(不含起点),git cherry-pick -n abc123 只暂存不提交,git cherry-pick -e abc123 挑选并编辑提交信息。
- 用 git bisect 二分查找引入 bug 的提交:先 git bisect start,再 git bisect bad 标记当前为坏、git bisect good v1.0.0 标记已知好版本,Git 会检出中间提交,测试后标记 good 或 bad,直到定位到问题提交,最后 git bisect reset 结束。
- 自动化 bisect:用 git bisect start HEAD v1.0.0 后执行 git bisect run ./test.sh,脚本退出码 0 表示 good,1-127(125 除外)表示 bad。
- 用 worktree 并行开发多个分支:git worktree list 列出已有工作树,git worktree add ../project-feature feature/new-feature 为已有分支添加工作树,git worktree add -b bugfix/urgent ../project-hotfix main 新建分支并添加工作树,git worktree remove ../project-feature 删除工作树,git worktree prune 清理失效工作树。
- 用 reflog 恢复丢失的提交或分支:git reflog 查看引用移动记录,git reflog show feature/branch 查看指定分支记录,找到提交哈希后用 git checkout abc123 检出,再用 git branch recovered-branch 建分支恢复;恢复已删除分支用 git reflog 找到哈希后执行 git branch deleted-branch abc123。
- 遵循最佳实践:强制推送一律用 git push --force-with-lease origin feature/branch 而非 --force;只 rebase 本地未推送的提交;写描述性提交信息;保持提交原子性;强推前先测试;记住 reflog 保留 90 天;高风险操作前先 git branch backup-branch 建备份分支,出错时用 git reset --hard backup-branch 回滚。
- 避免常见陷阱:不要 rebase 已公开的分支;不要不带 lease 强推;rebase 时仔细解决冲突并在之后测试;及时清理 worktree 以免占用磁盘;实验前先建安全分支;bisect 前先提交或 stash 保持工作区干净。
- 使用恢复命令:git rebase --abort、git merge --abort、git cherry-pick --abort、git bisect reset 中止进行中的操作;git restore --source=abc123 path/to/file 恢复文件到指定提交版本;git reset --soft HEAD^ 撤销上次提交但保留改动;git reset --hard HEAD^ 撤销并丢弃改动;git reflog 配合 git branch recovered-branch abc123 在 90 天内恢复已删除分支。
适用边界 · 注意事项
- 不要对已经推送并与他人共享的提交执行 rebase,会造成协作者历史冲突。
- 不要使用 --force 强推,应改用 --force-with-lease 以免覆盖队友的工作。
- 工作区有未提交改动时不要直接执行 bisect,应先 commit 或 stash。