git rebase 与 cherry-pick
约 802 字大约 3 分钟
布欧-Lewyon
2026-05-15
首页 › Git › 高级操作(在新窗口打开) › git rebase 与 cherry-pick
git rebase
变基(rebase)将一个分支的提交移植到另一个分支的最新提交之上,产生线性历史。
# 将 feature 分支 rebase 到 main 上
git switch feature
git rebase main
# 执行后,feature 的提交会在 main 的最新提交之后rebase vs merge
| 对比 | merge | rebase |
|---|---|---|
| 历史 | 保留分支拓扑 | 线性历史 |
| 冲突 | 一次解决 | 逐条提交解决 |
| 可读性 | 保留上下文 | 清晰线性 |
| 安全 | ✅ 公共分支可用 | ❌ 仅限私有分支 |
# 合并模式(保留分支结构)
git merge feature
# 变基模式(线性历史)
git rebase main
git switch main
git merge feature # 快进合并交互式 rebase
git rebase -i 是 Git 最强大的功能之一,可以重写、合并、修改历史:
# 交互式修改最近 3 个提交
git rebase -i HEAD~3
# 编辑器中出现:
# pick a1b2c3d Commit message 1
# pick d4e5f6f Commit message 2
# pick g7h8i9j Commit message 3操作命令
| 命令 | 简写 | 说明 |
|---|---|---|
pick | p | 保留该提交 |
reword | r | 保留内容,修改提交信息 |
edit | e | 保留内容,修改提交或文件 |
squash | s | 合并到前一个提交,合并提交信息 |
fixup | f | 合并到前一个提交,丢弃当前提交信息 |
exec | x | 在此提交后运行 shell 命令 |
drop | d | 删除该提交 |
常用场景
# 合并多个 commit 为一个
# 将最后 3 个 commit 合并
git rebase -i HEAD~3
# 将后两个改为 squash
# 修改某个 commit 的信息
git rebase -i HEAD~3
# 将对应 commit 的 pick 改为 reword
# 删除某个 commit
git rebase -i HEAD~5
# 将对应 commit 的 pick 改为 dropgolden rule of rebase
绝对不要对已推送到远程的提交执行 rebase。
# ❌ 危险:对已推送的分支 rebase 后强制推送
git rebase main
git push --force origin feature # 远程也有人拉取了 feature
# ✅ 安全:仅 rebase 未推送的私有分支
git rebase main
git push origin feature # 还没有人拉取该分支git cherry-pick
从其他分支挑选单个或多个提交到当前分支:
# 挑选一个提交到当前分支
git cherry-pick a1b2c3d
# 挑选多个提交
git cherry-pick a1b2c3d d4e5f6f
# 挑选一个范围
git cherry-pick start..end
# 不自动提交(只将更改放到工作区)
git cherry-pick -n a1b2c3dcherry-pick 场景
- 将 hotfix 提交到 main 后,同步到 release 分支。
- 从另一个分支只取某个功能的提交(不获取其他变更)。
- 撤销某个分支上的部分提交到当前分支。
小结
git rebase main将当前分支的提交移植到 main 之后,产生线性历史。git rebase -i HEAD~N交互式修改最近 N 个提交(合并、修改、删除)。- rebase 适合私有分支,已推送的公共分支用 merge。
git cherry-pick从其他分支挑选提交到当前分支。- 黄金法则:永不 rebase 已推送的公共分支。
上一节:git reset 与 revert 下一节:git stash 与 tag
