跳到主要内容

Git Rebase、Cherry-pick 与冲突处理

🌳 Rebase 和 Cherry-pick 是保持历史整洁的关键工具。清晰理解冲突背后的原理,能大幅减少合并事故。

Rebase 原理

Rebase vs Merge

# Merge:保留完整历史,产生一个合并提交
main: A---B---C
\
branch: D---E

合并后: A---B---C---M (其中 M 包含 D+E)

# Rebase:移植提交,历史整洁线性
main: A---B---C
branch: D'---E' (D,E 被重新应用到 C 之后)

交互式 Rebase

# 合并最近 3 个提交
it rebase -i HEAD~3

# 常用操作:
# pick 保留提交
# reword 修改提交信息
# edit 暫停并修改
# squash 合并到上一个提交
# fixup squash 但丢弃信息
# drop 删除提交

使用场景

场景命令
PR 前整理提交git rebase -i main
同步主分支最新变化git rebase origin/main
合并多个小提交git rebase -i HEAD~N 然后 squash

Cherry-pick

# 将单个提交应用到当前分支
git cherry-pick <commit-hash>

# 应用连续多个提交
git cherry-pick A..B # 应用 A 之后到 B方的所有提交

# 不自动提交,先展示变动
git cherry-pick -n <hash> # 展开到暂存区

适用场景:将 hotfix 应用到多个 release 分支。


冲突处理

理解冲突标记

<<<<<<< HEAD ← 当前分支的内容
当前分支的修改
======= ← 分隔线
传入分支的修改
>>>>>>> feature ← 传入分支名

冲突处理流程

# 1. 执行会产生冲突的操作
git rebase main
# 或
git merge feature

# 2. 查看冲突文件
git status

# 3. 编辑文件解决决冲突
# 删除标记行,保留正确内容

# 4. 标记为已解决
git add <file>

# 5. 继续 rebase 或完成 merge
git rebase --continue
# 或
git commit

# 晓缓操作
git rebase --abort
git merge --abort

使用图形工具

  • VS Code:内置冲突编辑器,支持三方合并
  • WebStorm:内置决冲突工具,可逐一审查变化
  • git mergetool 配置最爱工具

常用 Git 操作备忘

# 回退到上一个可工作状态
git stash
git stash pop

# 展示整洁的提交历史
git log --oneline --graph --all

# 删除当前分支已合并的分支
git branch -d <branch>

# 强制重置(危险!会丢失历史)
git reset --hard HEAD~1

常见误区

  • 已推送到远端的提交不要 Rebase,会导致其他人的历史混乱
  • Cherry-pick 相同提交到多个分支会产生不同哈希的重复提交
  • Rebase 后必须 force push,要告知团队成员更新本地分支