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,要告知团队成员更新本地分支