669 words
3 minutes
Git 高级操作:Rebase 与 Cherry-pick
Git 不仅是提交代码,更是管理代码历史的艺术
1. Rebase 合并提交
场景:整理提交历史
# 查看最近 3 次提交git log -3 --oneline
# 合并最近 3 次提交为一个git rebase -i HEAD~3
# 在编辑器中修改:# pick abc1234 feat: 添加用户模块# squash def5678 fix: 修复bug# squash ghi9012 fix: 优化代码squash vs fixup
# squash - 合并提交,保留提交信息pick abc1234 feat: 添加用户模块squash def5678 fix: 修复bug
# fixup - 合并提交,丢弃提交信息pick abc1234 feat: 添加用户模块fixup def5678 fix: 修复bugTIP建议:在 PR 合并前使用 rebase 整理历史,保持提交记录清晰。
2. Cherry-pick 拣选提交
场景:热修复应用到多分支
# 拣选单个提交git cherry-pick abc1234
# 拣选多个提交git cherry-pick abc1234 def5678 ghi9012
# 拣选并继续(遇到冲突)git cherry-pick --continue
# 拣选但不执行(查看差异)git cherry-pick -n abc1234实际案例
# 1. 在 release 分支修复 buggit checkout release-1.0git commit -m "fix: 修复登录问题"
# 2. 拣选修复到 main 分支git checkout maingit cherry-pick abc1234
# 3. 也需要拣选到 developgit checkout developgit cherry-pick abc12343. Reflog 恢复误操作
# 查看所有操作历史git reflog
# 输出示例:# abc1234 HEAD@{0}: commit: 添加新功能# def5678 HEAD@{1}: checkout: moving to main# ghi9012 HEAD@{2}: reset: moving to abc1234
# 恢复到误操作之前git reset --hard HEAD@{2}
# 或者恢复某个具体的提交git cherry-pick abc12344. Stash 高级用法
# 保存当前工作区git stash
# 保存并添加描述git stash push -m "WIP: 用户模块开发中"
# 列出所有 stashgit stash list
# 恢复并删除 stashgit stash pop
# 恢复指定 stashgit stash apply stash@{0}
# 清理所有 stashgit stash clear5. Submodule 子模块
# 添加子模块git submodule add https://github.com/user/repo.git libs/common
# 克隆包含子模块的仓库git clone --recursive main-repo
# 更新子模块git submodule update --remote6. 工作流最佳实践
main (生产环境) ↑release (预发布) ←── cherry-pick 热修复 ↑develop (开发) ←── rebase 整理历史 ↑feature/* (功能分支)推荐工作流
# 1. 从最新的 develop 创建功能分支git checkout -b feature/user-module develop
# 2. 开发完成后,rebase 到最新的 developgit fetch origingit rebase origin/develop
# 3. 推送到远程git push origin feature/user-module
# 4. 创建 PR,code review 后合并常见问题解决
| 问题 | 解决方案 |
|---|---|
| 提交历史太乱 | git rebase -i 整理 |
| 误删分支 | git reflog 恢复 |
| 合并冲突 | git mergetool 可视化解决 |
| 需要撤销提交 | git reset --soft HEAD~1 |
总结
掌握这些 Git 高级操作:
- 让提交历史更清晰
- 更灵活地管理多分支
- 快速恢复误操作
- 提高协作效率