登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  软件教程

开发工具 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 区域没有尚未提交的文件。

VS Code 风格源代码管理视图显示当前分支、干净工作区和提交图谱
图1:入口说明图,先确认当前分支与工作区状态,再开始重写本地提交历史。

在 终端 → 新建终端 中做一次轻量检查。示例中的注释说明每条命令的用途,不代表本文生成了真实运行截图:

# 确认没有未提交改动,并查看最近三条提交
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(合并并丢弃后续提交说明)。

VS Code 风格 git-rebase-todo 编辑器显示 pick squash fixup 选择
图2:操作示意图,待办列表从旧到新排列,保留首个提交并合并后续提交。

例如把待办内容整理成下面这样,然后保存并关闭编辑器:

pick a1 初始化登录
squash b2 补充校验
fixup c3 修正提示

提交短哈希和消息只是说明格式。保存后 Git 可能再次打开提交说明编辑器;保留一条清楚的最终消息,例如“完善登录校验”,保存并关闭即可。若只想快速合并、不需要保留后续说明,用 fixup;若要把说明合成一条,用 squash。

冲突时在界面里完成或撤销

如果不同提交改到了同一段内容,rebase 会暂停。点击 Source Control → Merge Changes 下的冲突文件,编辑器会显示 Current、Incoming 和 Result 区域。不要只按标签猜哪边正确:rebase 时两侧的含义取决于当前正在重放的提交,应结合代码意图手工确认。

VS Code 风格冲突状态界面显示 Merge Changes、Current、Incoming 和继续命令
图3:状态说明图,解决并暂存冲突后继续 rebase;不想保留改动时选择 abort。
  1. 打开冲突文件:在 Source Control 的 Merge Changes 区域点击文件,使用编辑器上方的 Current、Incoming、Accept Both 或 Compare Changes 操作;需要组合逻辑时直接修改 Result。
  2. 保存并暂存:保存文件后回到 Source Control,确认冲突标记已经清理,再点击文件旁的 + 将已解决文件加入 Staged Changes。
  3. 继续 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

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>