交互式变基(git rebase -i)可将本地未推送的零散commit合并为一个语义清晰的提交:先用git log --oneline -n 5查看历史,再执行git rebase -i head~3,将待合并提交前缀pick改为s,保存后编辑最终提交信息即可。

在Mac上整理开发分支的提交历史时,常遇到多次零散commit——比如调试改了三次、文档补了两次、最后又修了个拼写错误,全堆在log里。这种情况下直接推送到共享分支会污染历史,需要把它们压成一个语义清晰的commit再提交。
用交互式变基合并本地未推送的零散commit
这一步只适用于还没执行过 git push的提交。如果已推送到远程,跳过本节直接看“已推远程时的安全强制推送”。
第一步:打开终端,进入项目目录,运行以下命令查看最近5次提交:
git log --oneline -n 5
第二步:确认你要合并的commit范围——比如想把最近3次(从最新到最旧)压成一个,就执行:
git rebase -i HEAD~3
第三步:编辑器弹出后,第一行保持 pick 不动,后续所有要合并的行开头的 pick 全部改为 s(squash 的简写)。注意:必须保证这些 s 行紧接在 pick 行之后,中间不能插入其他 commit。否则 Git 会报错并中止操作。
第四步:保存退出,Git 会自动打开第二个编辑器让你重写 commit message。删掉所有以 # 开头的注释行,只留一行简洁描述,例如:“feat: add user profile upload with validation”。保存退出即完成。
已推远程时的安全强制推送
如果你已经 git push 过其中任意一次提交,rebase 后的 commit hash 全变了,直接 push 会被拒绝。此时不能跳过验证,也不能用 --force。
执行这条命令强制更新远程分支,但保留安全检查:
git push --force-with-lease origin feature-branch
注意:--force-with-lease 会比对远程分支最新状态。如果同事在你 rebase 期间又推送了新提交,命令会中止,避免覆盖他人工作。这是 Mac 和 Linux 下都必须遵守的安全底线。
跨分支整合:用 merge --squash 拍平他人功能分支
方法一:把别人写的 feature/login 分支全部改动,作为单次新提交落到你的 main 分支上
git checkout main → git merge --squash feature/login → git commit -m "feat: add login flow"
方法二:如果只想提取其中几个特定 commit(非连续),先切临时分支再 cherry-pick
git checkout -b temp-integrate main → git cherry-pick abc123 def456 → git reset --soft HEAD~2 → git commit -m "chore: integrate auth fixes"











