Git 指南
GUI 中的 Git 交互式变基:压缩、修复、重写、重新排序和删除提交
如何使用交互式 rebase GUI 压缩、修复、改写、重新排序和删除提交,git rebase -i 中每个操作的作用,以及如何撤消出错的 rebase。

交互式 rebase GUI 允许您从列表而不是文本文件重写分支上的提交:选择一个起始提交,为上面的每个提交指定一个操作(选择、压缩、修复、重写、编辑或删除),将它们拖到新的顺序中,然后让 Git 重播它们。它运行与 git rebase -i 相同的操作,因此结果与命令行相同。在 GitTree 中,右键单击要更改的提交正下方的提交,选择 Interactive Rebase of the Commits Below...,设置操作并单击 Start Rebase。如果结果错误,撤消会将分支放回原处。
这个交互式变基教程涵盖了每个操作、压缩提交的三种方法、匹配命令、自动压缩和安全网。屏幕截图显示了 GitTree 的交互式变基编辑器,它是 macOS、Windows 和 Linux 的 Git 客户端,但任何工具中的 Git 行为都是相同的。
Git 交互式 rebase 的作用以及何时使用它
正常的变基将一系列提交移动到新的基础上。交互式变基还可以让您在途中编辑该系列:Git 显示它将要重播的提交,您更改列表,Git 重建分支以匹配。每个重写的提交都会获得一个新的 id,这就是为什么交互式 rebase 属于共享工作之前的阶段。实现这一目标的典型原因:
- 在打开拉取请求之前,将一系列“wip”、“修复拼写错误”和“地址审查”提交压缩为一个有意义的提交。
- 重写有拼写错误、缺少票号或模糊摘要的提交消息。
- 将被遗忘的更改折叠到它所属的提交中,因此每个提交都建立在自己的基础上。
- 重新排序提交,以便重构在依赖它的功能之前进行。
- 删除不应到达主分支的调试提交或实验。
选择、挤压、修复、重写、编辑和删除:变基操作解释
交互式变基计划中的每一行都是一次提交加一项操作。这些是您日常使用的文件(Git 的 todo 文件还有一些用于脚本编写的文件,例如 exec 和 break):
| 行动 | 输入 GitTree | Git 的作用 | 用它来 |
|---|---|---|---|
| 挑选 | p | 保持提交原样。 | 保留提交(默认)。 |
| 改写 | r | 保留更改并让您编写新消息。 | 修复拼写错误或模糊的摘要。 |
| 编辑 | e | 重播提交,然后停止以便您可以修改它。 | 拆分提交或更改其文件。 |
| 壁球 | s | 将提交合并到上面的提交中并合并这两条消息。 | 加入相关的提交并保留他们的笔记。 |
| 修复 | f | 将提交合并到上面的提交中并仅保留较早的消息。 | 静静地折叠一个小固定物。 |
| 修复-C | 操作菜单:“修复,使用其消息” | 与修复类似,但保留此提交的消息。 | 将先前的消息与修复程序一起替换。 |
| 掉落 | d | 将提交保留在分支之外。 | 删除调试或实验提交。 |
顺序很重要,它与 `git log` 相反。 该计划按重播顺序在顶部列出最旧的提交,而 git log 和大多数提交图表首先显示最新的提交。压缩或修复总是会融入到其正上方的提交(较旧的提交)中。如果壁球最终位于顶部且没有任何可折叠的内容,则 GitTree 会拒绝开始,直到您将其移至您保留的提交下方。
等效的命令行: git rebase -i
在命令行中,您可以在要更改的提交的正下方命名提交:从 HEAD 倒数,或使用分支离开 main 的点。
# rewrite the last 5 commits
git rebase -i HEAD~5
# rewrite everything since the branch left main, without moving its base
git rebase -i $(git merge-base main HEAD)Git 打开带有待办事项列表的编辑器。这个计划与下面的屏幕截图相同:第二个提交被压缩到第一个提交中,第四个提交收到一条新消息。
pick f2cd67d chore(deps): upgrade Next.js and React
squash 19a1104 ci: cache pnpm store and run tests in parallel
pick f52edc8 refactor(api): extract repository layer from handlers
reword 05dfac2 feat(api): rate limit public endpoints
pick bf2385e fix(web): focus trap in the invite dialog保存并关闭文件,Git 开始重播。它会请求挤压消息和改写的消息,并在您继续或放弃的任何 edit 步骤或冲突处暂停:
git rebase --continue # after amending or resolving a conflict
git rebase --abort # stop and put the branch back where it wasGUI 改变了你编写计划的方式,而不是 Git 使用它做什么。 GitTree 与计算机上已安装的 Git(版本 2.39 或更高版本)运行相同的计划,因此应用程序和终端会产生相同的提交。对于更广泛的权衡,请阅读 Git GUI 与命令行。
如何在 GUI 中执行交互式变基:GitTree 一步一步
检查分支并整理工作副本
查看您要清理的分支。首先提交或存储未提交的更改,或者勾选为此变基存储它们的选项,然后将它们放回原处。
从基本提交打开编辑器
在提交图中,右键单击要更改的最旧提交正下方的提交,然后选择 Interactive Rebase of the Commits Below...。要同时移动到另一个分支,请右键单击该分支并选择“交互式将当前分支重新定基到此...”。
为每次提交选择一个操作
使用每行上的菜单,或聚焦一行并按 p、r、e、s、f 或 d 进行拾取、改写、编辑、压缩、修复或删除。
通过拖动或键盘重新排序
通过其手柄拖动行,或将其聚焦并按 Alt+↑ 或 Alt+↓,直到提交按您想要的顺序排列。
写入新消息
改写行会在适当的位置打开一个消息框。每个压缩组都会显示在列表下方,并显示其组合消息,可供编辑,因此您可以在开始之前看到生成的提交。
检查选项并启动
选择是否存储本地更改、移动指向这些提交(更新引用)的分支并安排修复!提交(自动挤压)。确认某些提交是否已在远程上,然后单击 Start Rebase。
继续、中止或撤消
如果某个步骤因编辑或冲突而停止,则横幅会提供“继续变基”和“中止变基”。当变基完成后,撤消会将整个分支放回原处。

如何在 Git GUI 中压缩提交
如何压缩提交的简短答案:将它们放在一起,将第一个保留为选择,将其余标记为压缩或修复,然后重播。 GitTree 为您提供了三种实现目标的方法。
在变基编辑器中压缩一组提交
从组下方的提交中打开编辑器,将其第一个提交设置为 pick,将其他提交设置为压缩,或者如果您不想要它们的消息,则将其设置为修复。如果组不连续,则将杂散提交拖动到位。 GitTree 预览每个包含挤压的组,因为它将成为提交,并在您可以编辑的框中显示组合消息。
选择图表中的提交并选择 Squash Commits
对于快速压缩,请选择图表中当前分支的两个或多个连续提交,右键单击并选择“压缩提交”。 GitTree 为您运行变基,并且撤消可以恢复单独的提交。 The same menu rewrites single commits in one step: Edit Commit Message…, Drop Commit…, Move Commit Up and Move Commit Down. These shortcuts work on commits that are not on a remote yet;对于推送的提交,请使用编辑器,它会要求您首先确认。
合并拉取请求时挤压
如果您的团队为每个拉取请求保留一次提交,您可能根本不需要重写分支:GitTree 的拉取请求视图可以与 squash 合并,并且您的本地分支保持原样。

修复提交和自动压缩:修复旧提交而无需手动重新排序
While you work, commit each small correction as a fixup of the commit it belongs to; Git 将其命名为 fixup! <original title>。稍后,一个带有 autosquash 的交互式变基将每个修复直接移到其目标下方并将其标记为修复,因此您所做的就是检查列表并开始。
# record a correction for an earlier commit
git commit --fixup=05dfac2
# correct the commit and replace its message too
git commit --fixup=amend:05dfac2
# later: fold every fixup! and amend! commit into its target
git rebase -i --autosquash main
# turn autosquash on for every interactive rebase
git config --global rebase.autoSquash true在 GitTree 中,在图表下方停靠的内置终端中运行这些命令,或者在提交消息框中键入 fixup!、空格和原始标题; Git 按标题匹配修正,因此两者都会创建相同的提交。通过 安排修复!,挤压!并修改! commits option on, the editor opens already arranged, and what you see is exactly what Git runs.
amend! 提交在计划中变成 fixup -C(GitTree 中的“Fixup,使用其消息”):其更改被折叠起来,其消息替换目标的消息。 Per the git-commit documentation, neither kind changes who authored the original commit.
交互式变基安全吗?撤消、重新记录和强制租用
变基不会立即删除旧的提交:它们仍然可以从引用日志中访问,直到 Git 的垃圾收集稍后清除无法访问的对象。真正的风险是失去旧分支的踪迹并覆盖远程同事的工作。
撤消已完成的变基
GitTree 在每次变基之前都会对分支进行快照,因此工具栏中的“撤消”可以一键将其恢复,包括变基通过 update-refs 移动的其他分支,只要此后没有任何内容移动过该分支。 如何撤消 git 重置、变基或提交 涵盖了该安全网的其余部分。在命令行上:
# still in the middle of the rebase
git rebase --abort
# already finished: go back to the tip from before the rebase
git reflog show --date=relative
git reset --hard ORIG_HEAD当变基开始时,Git 将 ORIG_HEAD 设置为旧提示,但在变基期间运行的 git reset (例如,拆分提交)会移动它。在变基之后,当前分支的前一个位置 @{1} 仍然指向旧的提示,因此 git reset --hard @{1} 也可以工作。 git reset --hard 会丢弃未提交的更改,因此请先提交或隐藏它们。
重写您已经推送的提交
GitTree 将已经在远程上的提交标记为“在远程上”,并要求您在重写之前确认。之后正常的推送会被拒绝,所以需要强制推送。使用租约形式,只有当远程分支仍然指向您上次看到的位置时,它才会覆盖远程分支:
git push --force-with-lease
# safer when something fetches in the background
git push --force-with-lease --force-if-includes后台提取可能会刷新您的远程跟踪分支并削弱租约,因此 git-push 文档 建议添加 --force-if-includes。在 GitTree 中,强制推送始终使用 --force-with-lease,固定到您确认时显示的远程提示,并且该提示保存在本地的 refs/ogt/trash 下,因此它从远程删除的提交不会丢失。撤消无法撤消强制推送,因为它更改了遥控器。
当步骤停止时:编辑和冲突
edit 步骤或不再完全应用的提交会暂停变基。 GitTree 显示计划的进度以及继续或中止的横幅。冲突在三向编辑器中打开,在解决 GUI 中的合并冲突 中介绍。在变基期间,Git 会交换合并的双方:“我们的”是您要变基的分支,“他们的”是您自己的提交,因此 GitTree 将它们标记为“变基到”和“您的提交”。 继续、跳过或中止活动操作 课程练习每个选择,并且要复制单个提交而不是重写分支,请参阅 cherry-pick。
在拉取请求之前清理提交历史记录的提示
- 让每一次提交都单独构建并通过测试,并将不相关的更改分开:一次提交用于重构,一次提交用于功能。
- 在打开拉取请求之前重新调整为最新的
main,以便审核者只能看到您的更改。 - 使用堆叠的树枝?打开 update-refs,以便基于您的分支构建的分支随着重写的提交而移动。
- 如果范围包含合并提交,则 GitTree 显示它但不会重写它;对于这种情况,请使用
git rebase -i --rebase-merges。 - 在推送之前检查 commit graph 中的结果,并让您自己的 AI 编码 CLI 草拟消息,如 使用 Claude Code 和 Codex 的 AI 提交消息 中所示。
- 首先通过免费课程 将未发布的工作重新建立到新的基础上 在一次性存储库上进行练习。
GitTree 在 English and Arabic 的 macOS、Windows 和 Linux 上有一个免费计划,涵盖所有 Git 功能,包括私有存储库; Nour 是 AI 助手,随 GitTree Pro 一起提供(请参阅定价)。它需要 Git 2.39 或更新版本以及 GitTree 帐户才能登录。从下载页面 获取它,或首先比较最佳 Git GUI 客户端。
常见问题
git rebase中的squash和fixup有什么区别?
两者都将一个提交合并到变基计划中其上方的提交中,因此两组更改最终会合并到一个提交中。 Squash 结合了两个提交消息并允许您编辑结果,而 fixup 仅保留较早提交的消息并丢弃较晚的提交消息。 Fixup -C 执行相反的操作并保留后面的消息。
如何压缩我最后 3 次提交?
在命令行上,运行 git rebase -i HEAD~3,将第一行保留为 pick,将其他两行更改为 squash 或 fixup,保存并编辑组合消息。在 GitTree 中,右键单击分支顶部的第四个提交,选择上面提交的交互式变基,将两个较新的提交设置为压缩,然后单击 Start Rebase。如果这三个提交尚未在远程上,您还可以选择它们并选择“压缩提交”。
如何撤消交互式变基?
如果 rebase 仍在运行,请使用 git rebase --abort 或 GitTree 横幅中的 Abort Rebase 按钮停止它。如果已经完成,请在 GitTree 中使用 Undo,这会恢复 rebase 之前拍摄的快照,或者在命令行上运行 git reset --hard ORIG_HEAD。如果您需要较旧的位置,引用日志会列出该分支的每个较早位置。
对我已经推送的提交进行变基是否安全?
只要您使用 git push --force-with-lease 进行推送,它在只有您使用的分支上是安全的,它拒绝覆盖您未见过的提交。在共享分支上,重写历史迫使其他人修复他们的副本,因此首先与您的团队达成一致,或者在合并拉取请求时压缩而不是重写分支。
GitTree是否支持修复!提交和自动压缩?
是的。标题以“fixup!”、“squall!”开头的提交或修改!可以在交互式变基编辑器打开时自动排列,无论是对于单个变基还是默认情况下通过可以遵循 rebase.autoSquash 设置的首选项。在运行任何内容之前,您仍然会看到排列好的列表,并且 Git 会准确地运行该列表。
我可以在不使用命令行的情况下对 macOS、Windows 和 Linux 执行交互式变基吗?
是的。 GitTree 的交互式变基编辑器在 macOS、Windows 和 Linux 上的工作方式相同:选择、改写、编辑、压缩、修复和放置,以及拖放或键盘重新排序和撤消。该应用程序有一个免费计划,涵盖所有 Git 功能(Nour,AI 助手,随 GitTree Pro 一起提供),与 GitTree 帐户配合使用,并使用计算机上已安装的 Git(版本 2.39 或更高版本)。
我应该使用交互式变基还是挤压合并进行挤压?
当几个有意义的提交应该存活、清理并按合理的顺序时,或者当审阅者逐个提交读取拉取请求提交时,请使用交互式变基。当整个拉取请求应作为一次提交提交到主分支上时,请使用挤压合并:它不会影响您自己的分支,并且不需要强制推送。
来源
有关其他产品的声明已根据其位于 2026年10月22日 的官方页面进行了检查。价格和功能发生变化;供应商的页面是事实的来源。