名称: git-advanced 描述: “高级Git操作与工作流,包括交互式变基、冲突解决、历史操作、二分法调试、拣选提交、引用日志恢复和分支管理策略。适用于:(1) 交互式变基与提交清理,(2) 复杂合并冲突解决,(3) 使用Git二分法追踪错误,(4) 历史重写与清理,(5) 分支策略实施(Git Flow、主干开发),(6) 使用引用日志恢复丢失的提交”
高级Git操作
概述
掌握用于复杂版本控制场景的高级Git工作流。本技能涵盖超越基础提交和合并的复杂操作,包括交互式变基、高级冲突解决、历史操作和策略性分支管理。
在以下情况下使用此技能:
- 代码评审前清理混乱的提交历史
- 策略性地解决复杂合并冲突
- 使用二分法(bisect)追踪错误
- 恢复丢失的提交或撤销错误操作
- 实施团队分支策略
- 安全地重写历史
核心能力
交互式变基
- 重新排序提交以获得逻辑清晰的历史记录
- 将多个提交压缩为一个
- 事后编辑提交信息
- 将提交拆分为更小的部分
- 从历史记录中删除不需要的提交
冲突解决
- 策略性合并冲突处理
- 理解三方合并
- 选择“我方”与“他方”策略
- 解释冲突标记
- 冲突期间部分文件暂存
Git二分法
- 使用二分法查找引入错误的提交
- 使用脚本自动二分
- 识别“好”与“坏”提交
- 高效调试回归问题
历史操作
- 安全地修改提交
- 过滤分支操作
- 使用BFG Repo-Cleaner处理大文件
- 谨慎重写历史
- 保留作者信息和日期
分支策略
- Git Flow工作流
- 主干式开发
- 功能分支工作流
- 发布分支管理
- 热修复流程
快速命令参考
交互式变基
# 交互式变基最近5个提交
git rebase -i HEAD~5
# 变基到主分支
git rebase -i main
# 解决冲突后继续
git rebase --continue
# 中止并返回原始状态
git rebase --abort
冲突解决
# 接受我方(当前分支)
git checkout --ours <文件>
# 接受他方(并入分支)
git checkout --theirs <文件>
# 列出冲突文件
git diff --name-only --diff-filter=U
# 标记为已解决
git add <文件>
Git二分法
# 开始二分会话
git bisect start
git bisect bad
git bisect good <提交哈希>
# 使用测试脚本自动化
git bisect run ./test-script.sh
# 结束二分会话
git bisect reset
拣选提交
# 应用特定提交
git cherry-pick <提交哈希>
# 拣选但不提交
git cherry-pick -n <提交哈希>
# 拣选一系列提交
git cherry-pick A^..B
引用日志恢复
# 查看引用日志历史
git reflog
# 恢复丢失的提交
git checkout -b recovery <提交哈希>
# 重置到先前状态
git reset --hard HEAD@{2}
核心工作流
1. 交互式变基工作流
何时使用:
- 推送前清理混乱的提交历史
- 合并“WIP”或“修复拼写错误”的提交
- 重新排序提交以获得逻辑进展
- 将大提交拆分为专注的更改
步骤:
# 1. 为最近N个提交启动交互式变基
git rebase -i HEAD~5
# 交互式编辑器打开提交列表
# 修改命令以重组历史
变基命令:
pick(p): 保留提交不变reword®: 保留提交,编辑信息edit(e): 保留提交,暂停以修改squash(s): 与前一提交合并,保留信息fixup(f): 与前一提交合并,丢弃信息drop(d): 完全删除提交
示例:
# 之前
pick abc1234 添加功能X
pick def5678 修复拼写错误
pick ghi9012 WIP提交
pick jkl3456 更新文档
# 清理后
pick abc1234 添加功能X
fixup def5678 修复拼写错误
drop ghi9012 WIP提交
reword jkl3456 更新文档
安全提示:
- 切勿变基已推送到共享分支的提交
- 创建备份分支:
git branch backup - 如果出现问题,使用
git reflog - 谨慎强制推送:
git push --force-with-lease
详细示例和高级技巧,请参阅 examples/interactive_rebase.md。
2. 冲突解决工作流
理解冲突标记:
<<<<<<< HEAD (当前更改)
您当前分支的代码
=======
合并分支的代码
>>>>>>> branch-name (传入更改)
解决流程:
# 1. 识别冲突
git status
# 2. 选择解决策略:
# 策略A:手动解决
vim <文件> # 在标记之间编辑
git add <文件>
# 策略B:接受一方
git checkout --ours <文件> # 保留您的更改
git checkout --theirs <文件> # 保留他们的更改
git add <文件>
# 策略C:使用合并工具
git mergetool
# 3. 继续操作
git merge --continue
# 或
git rebase --continue
三方差异:
# 显示您更改的内容
git diff --ours <文件>
# 显示他们更改的内容
git diff --theirs <文件>
# 显示共同祖先
git diff --base <文件>
常见冲突模式与解决方案,请参阅 examples/conflict_resolution.md。
3. 使用Git二分法追踪错误
场景: 当前版本存在错误,查找是哪个提交引入的。
手动二分:
# 1. 开始二分
git bisect start
# 2. 标记当前状态为坏
git bisect bad
# 3. 标记已知的好提交
git bisect good v1.0.0
# 4. 测试代码(Git检出中间提交)
# 运行应用,检查是否存在错误
# 5. 标记结果
git bisect bad # 如果存在错误
git bisect good # 如果不存在错误
# 重复直到Git找到第一个坏提交
# 6. 结束二分
git bisect reset
自动二分:
# 创建测试脚本 (test.sh)
#!/bin/bash
npm test
exit $?
# 运行自动二分
git bisect start
git bisect bad
git bisect good v1.0.0
git bisect run ./test.sh
# Git自动找到坏提交
git bisect reset
4. 分支管理
快速清理:
# 使用辅助脚本
bash scripts/git_helper.sh cleanup-branches
# 或手动清理
git branch --merged main | grep -v "\*\|main\|develop" | xargs git branch -d
git fetch --prune
检测陈旧分支:
# 显示分支及其最后提交日期
for branch in $(git branch -r | grep -v HEAD); do
echo -e "$(git show --format="%ci %cr" $branch | head -n 1)\t$branch"
done | sort -r
详细分支管理策略,请参阅 references/branch-management.md。
5. 引用日志恢复
恢复已删除分支:
# 查看引用日志
git reflog
# 查找分支被删除时的提交
# 恢复分支
git checkout -b feature-x <提交哈希>
撤销错误的重置:
# 意外运行了:git reset --hard HEAD~5
# 查看引用日志
git reflog
# 恢复先前状态
git reset --hard HEAD@{1}
恢复丢失的提交:
# 查找悬空提交
git fsck --lost-found
# 拣选恢复的提交
git cherry-pick <丢失提交哈希>
全面恢复技术,请参阅 references/reflog-recovery.md。
分支策略实施
此技能支持实施各种分支策略。根据团队需求选择:
Git Flow
最适合: 有预定发布计划、多个生产版本的项目
分支类型:
main: 生产就绪代码develop: 集成分支feature/*: 新功能release/*: 发布准备hotfix/*: 生产修复
快速开始:
# 功能开发
git checkout develop
git checkout -b feature/user-auth
# 开发功能
git checkout develop
git merge --no-ff feature/user-auth
主干式开发
最适合: 持续部署、快速迭代的团队
原则:
- 单一主分支
- 短生命周期功能分支(< 1天)
- 频繁集成
- 使用功能标志处理未完成工作
快速开始:
# 创建短生命周期分支
git checkout main
git checkout -b feature/quick-fix
# 当天工作并合并
git checkout main
git merge feature/quick-fix
完整分支策略工作流,请参阅 examples/branch_strategies.md。
最佳实践
变基前
- 创建备份分支:
git branch backup - 确保工作目录干净:
git status - 了解提交历史:
git log --oneline - 切勿变基公共/共享分支
冲突期间
- 理解冲突双方
- 解决后彻底测试
- 使用有意义的合并提交信息
- 记录复杂解决方案
分支管理
- 及时删除已合并分支
- 使用描述性分支名称:
feature/user-login - 保持分支专注且生命周期短
- 定期与主分支同步
历史整洁
- 推送前压缩“修复”提交
- 编写清晰、描述性的提交信息
- 保持提交原子性(一个逻辑更改)
- 尽可能使用约定式提交格式
全面最佳实践,请参阅 references/best-practices.md。
故障排除
变基冲突
# 如果冲突过于复杂
git rebase --abort
# 以不同方法重新开始
git merge --no-ff <分支>
丢失提交
# 始终先检查引用日志
git reflog
# 查找并恢复
git checkout -b recovery <提交哈希>
分离的HEAD状态
# 从分离的HEAD创建分支
git checkout -b new-branch-name
# 或返回分支
git checkout main
变基后推送失败
# 仅当您确定且分支未共享时
git push --force-with-lease
# 更安全:创建新分支
git checkout -b feature-v2
git push origin feature-v2
详细故障排除,请参阅 references/troubleshooting.md。
附加资源
详细指南
examples/interactive_rebase.md: 分步变基示例与场景examples/conflict_resolution.md: 常见冲突模式与解决方案examples/branch_strategies.md: 完整的Git Flow和主干式工作流
参考文档
references/branch-management.md: 分支清理自动化与策略references/reflog-recovery.md: 恢复技术与历史重写references/best-practices.md: 全面最佳实践与质量标准references/troubleshooting.md: 常见问题与紧急恢复
辅助脚本
scripts/git_helper.sh: 分支清理与冲突解决工具
快速参考命令
必知命令
# 交互式变基
git rebase -i HEAD~N
# 中止操作
git rebase --abort
git merge --abort
git cherry-pick --abort
# 查看历史
git log --oneline --graph --all
git reflog
# 冲突解决
git checkout --ours <文件>
git checkout --theirs <文件>
# 恢复
git fsck --lost-found
git reflog
# 清理
git branch --merged | xargs git branch -d
git fetch --prune
安全第一
- 重写历史前始终备份:
git branch backup - 切勿强制推送到共享分支:使用
--force-with-lease - 冲突后测试:不要假设解决方案正确
- 记录复杂操作:在合并提交中留下注释
- 使用引用日志:这是您30多天的安全网
掌握这些高级Git操作,以维护整洁的历史记录、高效解决冲突,并自信地管理复杂的开发工作流。