跳至内容
GitTree

Git 指南

GUI 中的 Git 交互式变基:压缩、修复、重写、重新排序和删除提交

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

撰写者 Kodmora已更新 阅读 3 分钟
GitTree 交互式变基编辑器,具有选择、压缩和重写步骤

交互式 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):

交互式变基操作、Git 对每个操作执行的操作以及它们在 GitTree 中的键
行动输入 GitTreeGit 的作用用它来
挑选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 was

GUI 改变了你编写计划的方式,而不是 Git 使用它做什么。 GitTree 与计算机上已安装的 Git(版本 2.39 或更高版本)运行相同的计划,因此应用程序和终端会产生相同的提交。对于更广泛的权衡,请阅读 Git GUI 与命令行。

如何在 GUI 中执行交互式变基:GitTree 一步一步

  1. 检查分支并整理工作副本

    查看您要清理的分支。首先提交或存储未提交的更改,或者勾选为此变基存储它们的选项,然后将它们放回原处。

  2. 从基本提交打开编辑器

    在提交图中,右键单击要更改的最旧提交正下方的提交,然后选择 Interactive Rebase of the Commits Below...。要同时移动到另一个分支,请右键单击该分支并选择“交互式将当前分支重新定基到此...”。

  3. 为每次提交选择一个操作

    使用每行上的菜单,或聚焦一行并按 p、r、e、s、f 或 d 进行拾取、改写、编辑、压缩、修复或删除。

  4. 通过拖动或键盘重新排序

    通过其手柄拖动行,或将其聚焦并按 Alt+↑ 或 Alt+↓,直到提交按您想要的顺序排列。

  5. 写入新消息

    改写行会在适当的位置打开一个消息框。每个压缩组都会显示在列表下方,并显示其组合消息,可供编辑,因此您可以在开始之前看到生成的提交。

  6. 检查选项并启动

    选择是否存储本地更改、移动指向这些提交(更新引用)的分支并安排修复!提交(自动挤压)。确认某些提交是否已在远程上,然后单击 Start Rebase。

  7. 继续、中止或撤消

    如果某个步骤因编辑或冲突而停止,则横幅会提供“继续变基”和“中止变基”。当变基完成后,撤消会将整个分支放回原处。

GitTree 的交互式变基编辑器:最旧的提交位于顶部,每个提交一个操作(此处是挤压,以及在适当位置键入新消息的重写),拖动手柄进行重新排序,然后使用 Start Rebase 运行计划。
GitTree 的交互式变基编辑器:最旧的提交位于顶部,每个提交一个操作(此处是挤压,以及在适当位置键入新消息的重写),拖动手柄进行重新排序,然后使用 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 合并,并且您的本地分支保持原样。

右键单击 GitTree 图表中的任何提交,即可对上面的提交进行交互式变基...,以及一步重写:编辑提交消息...、删除提交...、向上移动提交和向下移动提交。
右键单击 GitTree 图表中的任何提交,即可对上面的提交进行交互式变基...,以及一步重写:编辑提交消息...、删除提交...、向上移动提交和向下移动提交。

修复提交和自动压缩:修复旧提交而无需手动重新排序

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日 的官方页面进行了检查。价格和功能发生变化;供应商的页面是事实的来源。