SuperAPI AI 工具集

git-absorb

编程与开发

查看项目

更新于 10-15 20:32

技能介绍

用途:git-absorb 用于将未提交的改动自动折叠进功能分支上合适的提交。它自动识别暂存区的改动应属于哪个提交,并生成可被 autosquash 的 fixup 提交,免去手动查找提交 SHA 或交互式 rebase 的麻烦。

适用场景:处理评审反馈(评审指出多个提交中的问题)、修复功能分支中属于较早提交的缺陷、保持提交原子性(避免出现 fixes/oops 提交)、不想手动判断哪些提交需要哪些改动。

前置条件:必须先验证已安装,运行 git absorb --version;若未安装,不要自动安装,应告知用户并建议手动安装。手动安装命令:macOS 使用 brew install git-absorb;Linux(Debian/Ubuntu)使用 apt install git-absorb;Arch Linux 使用 pacman -S git-absorb;Cargo 使用 cargo install git-absorb;其他系统见 https://github.com/tummychow/git-absorb。

重要默认行为:默认只修改由你本人创作的提交,不会吸收到队友的提交中,可用 git absorb --force-author 或 git config absorb.forceAuthor true 改变;默认只搜索最近 10 个提交,可用 --base <branch> 指定范围或用 git config absorb.maxStack 50 增加;只考虑暂存区(git index)中的改动,未暂存改动会被忽略。

基本流程:修改文件;用 git add <files-you-fixed> 暂存;然后选择 git absorb --and-rebase(自动创建并 rebase),或先 git absorb,再用 git log 检查生成的 fixup 提交,最后 git rebase -i --autosquash <base-branch> 手动整合。

常用模式:评审反馈时修改多个文件后 git add 再 git absorb --and-rebase;功能分支中修复较早提交的缺陷;批量修复拼写和格式问题。

常用参数:--base <commit> 指定范围,--dry-run 预览不改动,--force 跳过安全检查,--one-fixup-per-commit 每个目标提交生成一个 fixup,--verbose 输出详细信息。例如 git absorb --base main --dry-run --verbose。

配置:看到“WARN stack limit reached, limit: 10”时,可 git config absorb.maxStack 50(本地)或 git config --global absorb.maxStack 50(全局)。其他配置包括 oneFixupPerCommit、autoStageIfNothingStaged、forceAuthor。

恢复:可用 git reset --soft PRE_ABSORB_HEAD 恢复到运行前状态,也可在 git reflog 中找到该提交。

原理:git-absorb 使用可交换补丁理论,对每个暂存 hunk 检查其是否能与最后一个提交交换,若不能则该提交即为该改动的父提交;若能与范围内所有提交交换,则保留在暂存区并给出警告;然后为吸收的改动创建 fixup 提交。

安全提醒:建议先在手动模式熟悉后再用自动模式;只在本地分支使用,不要用于已共享或已推送的提交;git reflog 可用于恢复;吸收后运行测试确认没有破坏。

常见问题:出现“WARN stack limit reached”时增大 maxStack 或指定 --base;“Can't find appropriate commit for these changes”可能因改动过新,可增大范围或作为新提交;“Command not found: git-absorb”表示未安装,按前置条件手动安装;“Conflicts during rebase”表示部分改动无法干净吸收,可手动解决或 git rebase --abort,并考虑将改动拆小。