669 words
3 minutes
Git 高级操作:Rebase 与 Cherry-pick

Git 不仅是提交代码,更是管理代码历史的艺术

1. Rebase 合并提交#

场景:整理提交历史#

Terminal window
# 查看最近 3 次提交
git log -3 --oneline
# 合并最近 3 次提交为一个
git rebase -i HEAD~3
# 在编辑器中修改:
# pick abc1234 feat: 添加用户模块
# squash def5678 fix: 修复bug
# squash ghi9012 fix: 优化代码

squash vs fixup#

Terminal window
# squash - 合并提交,保留提交信息
pick abc1234 feat: 添加用户模块
squash def5678 fix: 修复bug
# fixup - 合并提交,丢弃提交信息
pick abc1234 feat: 添加用户模块
fixup def5678 fix: 修复bug
TIP

建议:在 PR 合并前使用 rebase 整理历史,保持提交记录清晰。

2. Cherry-pick 拣选提交#

场景:热修复应用到多分支#

Terminal window
# 拣选单个提交
git cherry-pick abc1234
# 拣选多个提交
git cherry-pick abc1234 def5678 ghi9012
# 拣选并继续(遇到冲突)
git cherry-pick --continue
# 拣选但不执行(查看差异)
git cherry-pick -n abc1234

实际案例#

Terminal window
# 1. 在 release 分支修复 bug
git checkout release-1.0
git commit -m "fix: 修复登录问题"
# 2. 拣选修复到 main 分支
git checkout main
git cherry-pick abc1234
# 3. 也需要拣选到 develop
git checkout develop
git cherry-pick abc1234

3. Reflog 恢复误操作#

Terminal window
# 查看所有操作历史
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 abc1234

4. Stash 高级用法#

Terminal window
# 保存当前工作区
git stash
# 保存并添加描述
git stash push -m "WIP: 用户模块开发中"
# 列出所有 stash
git stash list
# 恢复并删除 stash
git stash pop
# 恢复指定 stash
git stash apply stash@{0}
# 清理所有 stash
git stash clear

5. Submodule 子模块#

Terminal window
# 添加子模块
git submodule add https://github.com/user/repo.git libs/common
# 克隆包含子模块的仓库
git clone --recursive main-repo
# 更新子模块
git submodule update --remote

6. 工作流最佳实践#

main (生产环境)
release (预发布) ←── cherry-pick 热修复
develop (开发) ←── rebase 整理历史
feature/* (功能分支)

推荐工作流#

Terminal window
# 1. 从最新的 develop 创建功能分支
git checkout -b feature/user-module develop
# 2. 开发完成后,rebase 到最新的 develop
git fetch origin
git 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 高级操作:

  • 让提交历史更清晰
  • 更灵活地管理多分支
  • 快速恢复误操作
  • 提高协作效率