Git rebase -I 并没有那么可怕

交互式 `git rebase -i` 被描述为一个强大但未被充分利用的工具,可用于重塑提交历史;许多开发者认为,对它以及 Git 底层数据模型的基本熟练掌握,对严肃的软件工作至关重要。评论者分享了具体工作流(fixup/autosquash、`git add -p`、使用 reflog、tag 和一次性分支)来让 rebase 更安全、更不吓人,并指出编辑器集成以及 `jj` 和 `git history` 等新工具能进一步简化这一过程。也有人对“rebase 纯洁主义”提出反驳,质疑相较于更简单的 merge 工作流,精心整理的历史究竟能带来多大帮助,尤其是在 Git 界面令人困惑且冲突风险存在的情况下。

关于 git rebase -i 的总体情绪

  • 许多评论者认为,交互式 rebase 是一项核心且不可怕的技能,它能对历史提供精确控制,改进评审,并且应该成为每位开发者工具箱的一部分。
  • 另一些人则认为它被过度吹捧、繁琐,或者对于简单工作流来说并无必要,并批评 Git 令人困惑的 CLI 以及围绕完美历史的“rebase 邪教”。

学习曲线、理解 Git 与文化

  • 强势观点:如果你害怕 rebase,那说明你并不真正理解 Git 的数据模型;花几个小时投入学习,会在整个职业生涯中持续受益。有人甚至把害怕 rebase 视为面试中的红旗。
  • 反对观点:Git 的 UX 客观上很差;很多团队只需要其中很小一部分功能,而在面试中过度强调 rebase 本身也同样是红旗。
  • 有人把掌握 shell、编辑器和 VCS(包括 rebase)描述为学习的三个必备“下午”。

安全性、恢复与备份

  • 重点强调,已提交的数据很难真正丢失;reflog、ORIG_HEAD 和神奇引用(magic refs)可以用来撤销搞砸的 rebase。
  • 也有人指出,这一切都建立在你知道 reflog 并能读懂它的前提上;他们建议使用更朴素的保护措施:临时分支、将 tag 作为保存点,甚至直接复制 .git
  • 还有几位提到,像 GitHub 这样的托管平台很少进行垃圾回收,因此已推送的提交实际上可能会永久存在,这既是安全网,也是安全风险。

冲突处理策略

  • 普遍的担忧集中在冲突解决过程中的细微错误,而不是 rebase 本身。
  • 缓解手段包括:merge.conflictStyle=zdiff3/diff3、git rerererange-diff,以及比较 rebase 前后的 heads。
  • 具体做法包括:中止大而混乱的 rebase;先 squash;先做重排序,再单独执行一次 autosquash;或者当冲突过于复杂时直接重建分支。

工作流、工具与别名

  • 大量使用 --fixup/--squash 配合 --autosquash;用 edit 拆分或修改旧提交;使用 git add -p/部分暂存。
  • 有些人更喜欢用 GUI/TUI(GitLens、magit、git gui)来做交互式 rebase 或按块暂存。
  • 还有人分享了用于简化 amend/fixup 工作流的别名和配置;也有人警告不要把短选项教给初学者。

替代方案与自动化

  • 文中提到了 jj、Fossil、Mercurial,以及 Git 正在演进中的命令(switchrestorehistorymaintenance),作为改善 UX 的尝试。
  • 还有少数人说他们现在在很大程度上把 rebase/提交工作交给代理或 LLM,并提醒在这样做之前先 commit 或 stash。