git rebase
基于VSCode操作git
安装软件与配置
执行下面命令无法和文章中显示相同内容再查看本章节,需要安装的软件
1 | GitLens |
配置与检查
打开扩展面板(
Ctrl+Shift+X),搜索 “GitLens”,确认由 Eric Amodio 发布的官方版本已安装且处于“启用”状态。若已安装但未生效,尝试右键点击插件 → “禁用” → 再“启用”,然后重启 VS Code。
开终端(
Ctrl+),输入git –version`,确认能正常输出版本号。若提示“不是内部命令”,说明 Git 未加入系统环境变量,需重新安装 Git 并勾选 “Add to PATH”。
在 VS Code 设置中手动指定 Git 路径:
- 打开设置(
Ctrl+,)→ 搜索git.path→ 填入 Git 可执行文件的完整路径(如 Windows 下为C:\Program Files\Git\bin\git.exe)。
- 打开设置(
检查是否有其他插件冲突
- 使用 VS Code 内置的二分排查工具定位冲突插件:
- 按
Ctrl+Shift+P→ 输入Developer: Start Extension Bisect→ 按提示操作,逐步禁用/启用插件,直到找到导致 GitLens 失效的元凶。 - 常见冲突插件包括:Git Graph、Git History、GitHub Pull Requests 等。
- 按
如果出现如下情况,点击图片中右上角红框位置:
在VSCode 中打开Git命令行
1 | Ctrl + ` |
配置 VS Code 作为 Git 的默认编辑器
为了让 git rebase -i 等操作能在 VS Code 中打开编辑界面,需要执行以下两条命令:
1 | git config --global core.editor "code --wait" |
执行完后不需要重启电脑,关闭当前终端,重新打开一个新的终端(或者直接在当前终端里再试),再执行别的命令
加了--global
写入你用户主目录下的.gitconfig 文件(Windows 在C:\Users\你的用户名\.gitconfig)。
作用范围:你电脑上的所有 Git 仓库都会使用 VS Code 作为编辑器。
不加--global(即默认--local)
写入当前项目根目录下的 .git/config 文件。
作用范围:只对这个当前仓库有效。切换到其他项目再用 git rebase -i 时,就不会弹出 VS Code,还是会用 Git 的默认编辑器。
| 配置方式 | 作用范围 | 存储位置 |
|---|---|---|
git config --global |
对当前电脑上所有 Git 仓库生效 | 用户主目录 .gitconfig 文件 |
git config(默认 --local) |
仅对当前这一个仓库生效 | 当前项目 .git/config 文件 |
验证配置是否生效
在终端执行:
1 | git config --get core.editor |
输出分别应该是code --wait或带完整路径的Code.exe --wait。
提示
core.editor:决定 git commit、git merge、git tag 等操作弹出的编辑器。sequence.editor:专门控制 git rebase -i 弹出的编辑器。
Git 的配置是有优先级的,优先级顺序为:项目级 (--local) > 全局级 (--global) > 系统级 (--system)
git rebase -i变基显示乱码
修改如下功能
(命令行中乱码)修改 Git 配置
Git 在 Windows 上有时会默认使用 GBK 编码处理日志,而 VS Code 期望的是 UTF-8。请尝试在终端中运行以下命令来强制 Git 使用 UTF-8:
- 设置提交日志编码:
1 | git config --global i18n.logoutputencoding utf-8 |
- 设置提交信息编码:
1 | git config --global i18n.commitencoding utf-8 |
- 设置终端输出编码(如果终端也乱码):
1 | git config --global core.quotepath false |
注意: 修改完配置后,建议重启 VS Code 以确保设置生效。
检查 VS Code 的编码设置
- 确保 VS Code 自身也是用 UTF-8 来打开和显示文件的。
- 打开 VS Code 的设置(快捷键 Ctrl + ,)。
- 在搜索框中输入
files.encoding。 - 确认其值被设置为
utf8。
处理终端编码问题(针对 Windows 用户)
如果你使用的是 Windows 系统,终端的默认编码可能是 GBK (代码页 936),这与 UTF-8 不兼容。
临时解决方案: 在 VS Code 的终端中,先执行 chcp 65001 命令,将当前终端的代码页切换为 UTF-8,然后再执行 git rebase -i。
根本解决方案: 将 VS Code 的默认终端设置为 Git Bash。Git Bash 原生支持 UTF-8,能从根本上避免这类编码冲突。你可以在 VS Code 的终端面板点击“+”号旁边的下拉箭头,选择“选择默认配置文件”,然后选择 Git Bash。
命令
查看提交历史的常用命令
查看提交历史6条记录
1 | git log --oneline -8 |
或
查看提交历史全部记录,没有翻到最后一条历史记录需要退出,直接按q
1 | git log --oneline |
注意:变基前需要将未暂存的文件添加到暂存区或删除文件,否则无法变基
变基内容
- 将
57c24e0合并到0d7fb34(通过调整提交顺序 +squash) - 将
86ddd79合并到32acc0b(通过调整提交顺序 +squash) - 先修改
c2a51b1的文件内容(通过edit暂停变基)
变基步骤
如果需要变基,前面6个需要变动,最好在变基上面多加1个作为父节点。如下时我要变基内容,这是没有变基前的顺序,通过下面的命令(选一种就可以)选择变基
1 | 352483c (HEAD -> develop) 暂时存储 |
写法一
1 | git rebase -i HEAD~7 |
的核心含义是**“对当前分支最近的7 次提交进行交互式变基”**
写法二
1 | git rebase -i bb82405 |
输入命令后,可以看到如下图片所示:
按以下规则修改文件:
- 将
86ddd79移动到32acc0b上方(紧邻其后),并改为squash。 - 将
57c24e0移动到0d7fb34上方(紧邻其后),并改为squash。 - 将
c2a51b1改为edit(暂停修改文件)。
开始变基
有一个明显的按钮,通常写着 Start Rebase 或 Begin Rebase。如下图所示:
点击后,GitLens 才会将你选好的这些操作(pick, edit, squash)写入到 .git/rebase-merge/git-rebase-todo 文件中;
等待 VS Code 弹出新窗口
窗口会自动弹出如下所示:
删除所有你不需要的行,只保留你想要显示的最终描述。
建议将文件内容修改为下面这样(删除了所有 # 开头的注释行,并将两句话合并为一句):
操作说明:
- 删除
# This is a combination...到# Changes to be committed...的所有行。 - 将原来的两行
fix: ...删掉。 - 写入上面那行新的合并描述(或者你想保留原来的两句也可以,只要没有
#号就行)。
保存并关闭
- 按
Ctrl + S保存文件。 - 按
Ctrl + W关闭当前这个文件标签页。
修改完成前面的功能后,会出现如下提示
1 | You can amend the commit now, with |
接下来就可以修改 c2a51b1 的文件内容
修改 c2a51b1 的文件内容
点击如图所示位置,打开需要修改的文件:
就可以开始修改内容
修改提交
修改好内容后,点击上图位置中的继续按钮,会出现如图所示,直接点击是,就完成了对文件的修改。
或者,你也可以在终端中执行:
1 | git commit --amend --no-edit |
继续变基
- 修改提交完成后,你需要告诉 Git 继续执行剩下的变基操作。
- 打开 VS Code 的 终端(
Terminal > New Terminal)。 - 输入以下命令并回车:
1 | git rebase --continue |
基于VSCode的变基完成
变基完成后的操作流程(重点)
完成 rebase 后,立即执行 git status 确认状态,避免残留。
若需中断 rebase,优先用 git rebase –abort,而非直接关闭终端。
变基完成后推送到远程仓库中
这里是强推命令,
1 | git branch 查看有哪些分支 |
软件错误
GitLens — Git supercharged
这通常与 VS Code 内置的 Electron 浏览器引擎在沙箱模式下对 Service Worker 的支持异常有关。以下是几种经过验证的解决方案:
- 临时启动方案(推荐优先尝试)
关闭所有 VS Code 窗口,打开命令提示符(Windows)或终端(Mac/Linux),输入以下命令启动 VS Code:code --no-sandbox
此命令会绕过沙箱限制,使 Web 视图能正常加载。注意:该方式仅用于临时调试,不建议长期使用,因会降低安全性。 - 永久修复方案(清除缓存 + 配置运行时参数)
完全关闭 VS Code(包括后台进程)。 或者卸载重新安装
删除以下缓存文件夹内容(路径根据系统调整):
- Windows:
C:\Users\<用户名>\AppData\Roaming\Code\Cache、CachedData、CachedExtensions、CachedExtensionVSIXs、Code Cache - Mac:
~/Library/Application Support/Code/Cache、CachedData、CachedExtensions、CachedExtensionVSIXs、Code Cache
- Windows:
重新启动 VS Code,进入命令面板
(Ctrl+Shift+P / Cmd+Shift+P),输入并执行:Preferences: Configure Runtime Arguments
变基中出现的错误处理
错误提示一:
1 | fatal: It seems that there is already a rebase-merge directory, and |
继续或中止当前变基(推荐)
如果你确实还在处理上一次的变基,或者想安全退出:
- 继续变基:
git rebase --continue - 跳过当前冲突提交:
git rebase --skip - 完全放弃变基,恢复到变基前状态:
git rebase --abort
执行后,Git 会清理 .git/rebase-merge 目录并恢复正常状态。
手动删除残留目录(适用于确定无需保留上次变基内容)
如果你确认上次的变基已无价值,或上述命令无效,可强制删除残留目录:
1 | rm -fr ".git/rebase-merge" |
然后重新运行你想要的 git rebase 命令即可。
建议优先尝试 git rebase --abort,它能安全回退到变基前状态,避免误删重要中间文件。
如果上述没办法解决问题,复制一个代码出来执行如下操作
核心结论
直接删除 .git/rebase-merge 目录即可恢复正常。由于你已提交代码且 git rebase --abort 失效,说明残留文件无实际价值,手动清理是安全且必要的操作。
强制删除残留目录(PowerShell 专用命令)
在项目根目录执行以下命令(关键:使用 PowerShell 原生命令,非 Linux 语法):
1 | Remove-Item -Recurse -Force ".git\rebase-merge" -ErrorAction SilentlyContinue |
Recurse:递归删除目录内所有内容Force:强制删除(忽略只读/隐藏属性)ErrorAction SilentlyContinue:若目录不存在则静默跳过(避免报错中断流程)
验证状态是否恢复
1 | git status |
正常状态:显示 On branch XXX, nothing to commit, working tree clean
异常状态:若仍提示 rebase 相关错误,说明有其他进程占用 Git 目录(见下文排查)。
残留的 rebase-merge 目录 仅存储临时操作状态,不包含实际代码。
你已通过 git rebase –continue 完成提交,说明 代码变更已持久化到仓库,删除状态文件不会影响已提交内容
为何 git rebase --abort 失效?
错误 warning: could not read '.git/rebase-merge/head-name' 表明状态文件已损坏或不完整,Git 无法自动清理,必须手动干预
不要使用 rm -fr:PowerShell 中此命令无效(会报 NamedParameterNotFound 错误),必须用 Remove-Item。
路径分隔符:Windows 需用反斜杠 \(如 .git\rebase-merge),而非 Linux 的正斜杠 /