开发工具 Git rebase 合并提交 怎样处理
来源:17golang原创
时间:2026-10-22 06:31:25 492浏览 收藏
如果你在 VS Code 里连续提交了“初始化登录、补充校验、修正提示”三个本地提交,想在推送前整理成一个干净提交,可以用交互式 git rebase。核心做法是保留最早的一条 pick,把后面的提交改成 squash 或 fixup。这会重写提交历史,只适合尚未被其他人依赖的本地提交。
官方地址:https://code.visualstudio.com/
本文使用 VS Code 的源代码管理视图、集成终端和提交图谱完成操作。VS Code 只是 Git 的图形化入口,真正执行合并提交的仍是仓库里的 Git。
先把要合并的提交范围看清楚
用 文件 → 打开文件夹 打开目标仓库,点击左侧活动栏的 Source Control 图标(macOS 可按 ⌘⇧G,Windows/Linux 可按 Ctrl+Shift+G)。确认状态栏显示目标分支,例如 feature/login,并检查 Changes 区域没有尚未提交的文件。

在 终端 → 新建终端 中做一次轻量检查。示例中的注释说明每条命令的用途,不代表本文生成了真实运行截图:
# 确认没有未提交改动,并查看最近三条提交
git status
git log --oneline -3
# 确认当前分支,避免在错误分支上整理历史
git branch --show-current
如果 git status 显示有改动,先提交或使用 Git stash 保存;不要把未提交改动混进这次 rebase。若目标提交已经推送到共享分支,也先暂停,避免别人正在基于旧 SHA 开发。
在待办编辑器里决定哪些提交合并
把光标放在 VS Code 的集成终端,执行下面的命令。HEAD~3 表示把最近三条提交放入待办列表;如果要整理五条,就改成 HEAD~5。
# 打开最近三条提交的交互式 rebase 待办
git rebase -i HEAD~3
VS Code 会打开名为 git-rebase-todo 的编辑器。列表按从旧到新的顺序排列:第一行通常保留 pick,后面的提交可以改为 squash(合并并继续编辑提交说明)或 fixup(合并并丢弃后续提交说明)。

例如把待办内容整理成下面这样,然后保存并关闭编辑器:
pick a1 初始化登录
squash b2 补充校验
fixup c3 修正提示
提交短哈希和消息只是说明格式。保存后 Git 可能再次打开提交说明编辑器;保留一条清楚的最终消息,例如“完善登录校验”,保存并关闭即可。若只想快速合并、不需要保留后续说明,用 fixup;若要把说明合成一条,用 squash。
冲突时在界面里完成或撤销
如果不同提交改到了同一段内容,rebase 会暂停。点击 Source Control → Merge Changes 下的冲突文件,编辑器会显示 Current、Incoming 和 Result 区域。不要只按标签猜哪边正确:rebase 时两侧的含义取决于当前正在重放的提交,应结合代码意图手工确认。

- 打开冲突文件:在 Source Control 的 Merge Changes 区域点击文件,使用编辑器上方的 Current、Incoming、Accept Both 或 Compare Changes 操作;需要组合逻辑时直接修改 Result。
- 保存并暂存:保存文件后回到 Source Control,确认冲突标记已经清理,再点击文件旁的 + 将已解决文件加入 Staged Changes。
- 继续 rebase:在 终端 → 新建终端 执行:
# 冲突文件已保存并暂存后,继续应用当前提交
git rebase --continue
如果下一个提交仍然冲突,重复“打开、合并、保存、暂存、继续”。如果发现整理方向不对,可以在命令面板(⌘⇧P 或 Ctrl+Shift+P)运行 Git: Abort Rebase,或在集成终端执行:
# 放弃本次 rebase,尽量回到开始前的状态
git rebase --abort
--abort 会撤销本次 rebase 的冲突处理结果;开始前原本就有的未提交改动不要依赖它来恢复,重要改动应提前提交或 stash。
用提交图谱验收,再决定是否推送
rebase 成功后,在 Source Control 中展开 Source Control Graph,检查历史是否从三条本地提交变成一条新的整理提交;同时在集成终端确认状态不再显示 rebase 正在进行:
# 核对 rebase 已结束,并查看整理后的最近提交
git status
git log --oneline -3
最后按下面的边界做决定:
| 场景 | 建议 | 原因 |
|---|---|---|
| 只在本地的个人提交 | 整理后正常推送 | 没有其他人依赖旧提交 SHA |
| 已经推送但没有人基于它继续开发 | 先通知协作者,再评估强制更新 | rebase 已改变历史 |
| 共享分支或他人正在使用 | 不要直接 rebase 后强推 | 可能让其他人的分支无法正常衔接 |
确实需要更新一个已经推送的个人分支时,优先使用更谨慎的 --force-with-lease,并确认远端没有新的提交:
# 只在已确认远端没有他人新提交时更新个人分支
git push --force-with-lease origin feature/login
常见问题
为什么待办列表里最旧的提交要放在第一行?
Git 会按待办顺序重放提交。先保留最旧提交作为基准,再把后续提交 squash 或 fixup,最终才能得到一条合并后的提交。
rebase 过程中能不能直接关闭 VS Code?
不要把关闭编辑器当成取消操作。先用 git status 看当前状态;要继续就解决并暂存冲突后运行 git rebase --continue,要放弃就运行 git rebase --abort。
合并提交后为什么不能普通 push?
rebase 会生成新的提交 SHA,远端仍保存旧历史时,普通 push 通常会被拒绝。先确认这是允许重写的个人分支,再考虑 --force-with-lease,不要对共享主分支直接强推。
相关资料
VS Code 源代码管理说明:https://code.visualstudio.com/docs/sourcecontrol/overview
VS Code 冲突处理说明:https://code.visualstudio.com/docs/sourcecontrol/merge-conflicts
Git rebase 官方手册:https://git-scm.com/docs/git-rebase
-
146 收藏
-
358 收藏
-
158 收藏
-
109 收藏
-
446 收藏
-
248 收藏
-
206 收藏
-
264 收藏
-
116 收藏
-
184 收藏
-
122 收藏
-
245 收藏
-
159 收藏
-
431 收藏
-
404 收藏
-
235 收藏
-
408 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习