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
2
git config --global core.editor "code --wait"
git config --global sequence.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
2
git config --get core.editor
git config --get sequence.editor

输出分别应该是code --wait或带完整路径的Code.exe --wait

提示

core.editor‌:决定 git commitgit mergegit 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. 设置提交日志编码:
1
git config --global i18n.logoutputencoding utf-8
  1. 设置提交信息编码:
1
git config --global i18n.commitencoding utf-8
  1. 设置终端输出编码(如果终端也乱码):
1
git config --global core.quotepath false

注意: 修改完配置后,建议重启 VS Code 以确保设置生效。

检查 VS Code 的编码设置

  1. 确保 VS Code 自身也是用 UTF-8 来打开和显示文件的。
  2. 打开 VS Code 的设置(快捷键 Ctrl + ,)。
  3. 在搜索框中输入 files.encoding
  4. 确认其值被设置为 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

注意:变基前需要将未暂存的文件添加到暂存区或删除文件,否则无法变基

变基内容

  1. 57c24e0 合并到 0d7fb34(通过调整提交顺序 + squash
  2. 86ddd79 合并到 32acc0b(通过调整提交顺序 + squash
  3. 先修改 c2a51b1 的文件内容(通过 edit 暂停变基)

变基步骤

如果需要变基,前面6个需要变动,最好在变基上面多加1个作为父节点。如下时我要变基内容,这是没有变基前的顺序,通过下面的命令(选一种就可以)选择变基

1
2
3
4
5
6
7
352483c (HEAD -> develop) 暂时存储
57c24e0 fix:
86ddd79 fix:
c2a51b1 fix:
0d7fb34 fix:
32acc0b fix:
bb82405 feat:

写法一

1
git rebase -i HEAD~7

的核心含义是**“对当前分支最近的7 次提交进行交互式变基”**

写法二

1
git rebase -i bb82405

输入命令后,可以看到如下图片所示:

按以下规则修改文件:

  • 86ddd79 移动到 32acc0b 上方(紧邻其后),并改为 squash
  • 57c24e0 移动到 0d7fb34 上方(紧邻其后),并改为 squash
  • c2a51b1 改为 edit(暂停修改文件)。

开始变基

有一个明显的按钮,通常写着 Start RebaseBegin Rebase。如下图所示:

点击后,GitLens 才会将你选好的这些操作(pick, edit, squash)写入到 .git/rebase-merge/git-rebase-todo 文件中;

等待 VS Code 弹出新窗口

窗口会自动弹出如下所示:

删除所有你不需要的行,只保留你想要显示的最终描述。

建议将文件内容修改为下面这样(删除了所有 # 开头的注释行,并将两句话合并为一句):

操作说明

  1. 删除 # This is a combination...# Changes to be committed... 的所有行。
  2. 将原来的两行 fix: ... 删掉。
  3. 写入上面那行新的合并描述(或者你想保留原来的两句也可以,只要没有 # 号就行)。

保存并关闭

  1. Ctrl + S 保存文件。
  2. Ctrl + W 关闭当前这个文件标签页。

修改完成前面的功能后,会出现如下提示

1
2
3
4
5
6
7
You can amend the commit now, with

git commit --amend

Once you are satisfied with your changes, run

git rebase --continue

接下来就可以修改 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
2
3
git branch 查看有哪些分支
git push --force-with-lease <远程仓库名> <本地分支名>:<远程分支名> //选择要推送的分支命令格式如下
git push --force-with-lease origin master

软件错误

GitLens — Git supercharged

这通常与 VS Code 内置的 Electron 浏览器引擎在沙箱模式下对 Service Worker 的支持异常有关。以下是几种经过验证的解决方案:

  • 临时启动方案(推荐优先尝试)
    关闭所有 VS Code 窗口,打开命令提示符(Windows)或终端(Mac/Linux),输入以下命令启动 VS Code:code --no-sandbox
    此命令会绕过沙箱限制,使 Web 视图能正常加载。注意:该方式仅用于临时调试,不建议长期使用,因会降低安全性。
  • 永久修复方案(清除缓存 + 配置运行时参数)
  1. 完全关闭 VS Code(包括后台进程)。 或者卸载重新安装

  2. 删除以下缓存文件夹内容(路径根据系统调整):

    • Windows:C:\Users\<用户名>\AppData\Roaming\Code\CacheCachedDataCachedExtensionsCachedExtensionVSIXsCode Cache
    • Mac:~/Library/Application Support/Code/CacheCachedDataCachedExtensionsCachedExtensionVSIXsCode Cache
  3. 重新启动 VS Code,进入命令面板(Ctrl+Shift+P / Cmd+Shift+P),输入并执行:Preferences: Configure Runtime Arguments

变基中出现的错误处理

错误提示一:

1
2
3
4
5
6
7
8
fatal: It seems that there is already a rebase-merge directory, and
I wonder if you are in the middle of another rebase.  If that is the
case, please try
        git rebase (--continue | --abort | --skip)
If that is not the case, please
        rm -fr ".git/rebase-merge"
and run me again.  I am stopping in case you still have something
valuable there.

继续或中止当前变基(推荐)
如果你确实还在处理上一次的变基,或者想安全退出:

  • 继续变基: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 的正斜杠 /