git merge --squash 是将 feature 分支所有更改压缩为单次提交合入 main 的最直接方式:先切换到 main,执行 git merge --squash feature,再手动 git commit 提交暂存变更;它丢弃原始提交哈希与作者信息,生成全新提交。

git merge --squash 合并分支时只留一个提交
想把 feature 分支上一堆零散提交压成一个干净提交再合入 main,git merge --squash 是最直接的方式。它不创建合并提交,而是把所有改动暂存为“待提交状态”,由你手动 git commit 一次完成。
常见错误是执行完 git merge --squash 就以为合并完了——其实还没 commit,git status 会显示大量修改文件,不提交就 push 不上去。
- 先切到目标分支:
git checkout main(或git switch main) - 执行压缩合并:
git merge --squash feature - 此时工作区已应用全部变更,但未提交;用
git status确认,再git add .(如需调整暂存) - 手动提交:
git commit -m "feat: add user profile page"(消息自己写,别用默认的 squashed 提交模板)
rebase -i 把分支内多个提交压成一个再合并
如果 feature 分支还没推送到远程,或者你有权限强制更新远端分支,用 git rebase -i 更灵活:它在合并前就整理好本地历史,后续 git merge 就是标准快进或普通合并,不会带 --squash 的副作用。
容易踩的坑是选错基点——git rebase -i main 要求 main 已更新到最新,否则可能重复变基或丢提交;另外 pick 改成 squash 或 s 后保存退出,编辑器里要统一提交信息,否则第二步会失败。
- 确保本地 main 是最新:
git checkout main && git pull - 切换到 feature:
git checkout feature - 交互式变基:
git rebase -i main(编辑器中把除第一条外的pick全改成s) - 保存退出后,会打开另一个编辑器让你写最终提交信息;保存即完成变基
- 再切回 main,
git merge feature就只剩一个提交
push 时遇到 non-fast-forward 拒绝怎么办
用了 rebase -i 整理 history 后,git push origin feature 很可能被拒绝,报错类似:! [rejected] feature -> feature (non-fast-forward)。这是因为远端分支已有不同历史,Git 默认禁止覆盖。
GitHub 仓库备份技能 - 将 OpenClaw 工作空间自动或手动备份至 GitHub 私有仓库。支持自动定时备份和手动交互式配置,引导完成 Token 配置、仓库创建、首次备份及定时任务设置。用途:(1) 首次设置 (2) 日常备份。
这时不能硬加 --force,得用 --force-with-lease:它会检查远端分支是否真没人动过,避免误覆盖他人推送。
- 确认团队没人正在基于旧 feature 开发(尤其当分支是共享的)
- 执行:
git push --force-with-lease origin feature - 如果提示 “stale info”,说明远端已更新,需先
git fetch origin再重试 rebase - 若必须强推且确定安全,才用
--force,但多数协作场景应避免
merge --squash 和 rebase -i 的关键区别在哪
核心差异不在结果(都得到一个提交),而在**历史归属和可追溯性**。merge --squash 完全丢弃原分支的提交哈希和作者信息(新提交作者=当前用户,日期=当前时间);而 rebase -i 保留原始作者(git log --pretty=full 可见 Author 字段),只是重写了 committer 和时间。
这对合规审计、贡献统计、责任追踪很关键。比如开源项目要求署名,或公司要求明确谁写了某段逻辑,就不能用 --squash。
- 需要保留作者信息 → 选
rebase -i+merge - 只想快速合入、不关心来源、分支纯属临时实验 →
merge --squash更轻量 - CI/CD 流水线依赖提交触发(如 commit msg 含
chore:才跳过测试),注意 squash 后的提交信息要手工匹配规则
真正麻烦的不是操作本身,是搞不清该用哪个策略——尤其当分支已经 shared 到远程。改历史前,先看 git branch -r --contains HEAD~3 确认有没有别人基于你的提交继续开发。

















