git push被拒绝主因是本地与远程提交历史不兼容,需先git pull或fetch同步;常见于他人已推送、本地基于旧head提交或初始化时远程已有文件(如readme.md)。

Git push 被拒绝,90% 不是权限或网络问题,而是本地分支历史和远程不兼容——必须先同步,不能硬推。
看到 [rejected] main -> main (fetch first) 怎么办
这是最典型的提示,说明远程分支有你本地没有的 commit(比如别人刚 push 过 README.md,或你 clone 后没 pull 就直接 commit+push)。Git 拒绝非快进(non-fast-forward)推送,防止覆盖他人工作。
正确做法是立刻执行:git pull origin main(把远程最新内容拉下来并自动合并)。如果提示冲突,就手动编辑标有 和 <code>>>>>> origin/main 的文件,删掉标记、保留最终内容,再 git add . && git commit -m "resolve",最后 git push origin main。
别跳过这步直接 git push -f——尤其在团队共用的 main 分支上,那等于清空别人刚提交的代码。
想保持线性历史?用 git pull --rebase 而不是默认 git pull
默认 git pull 是 fetch + merge,会多一个 merge commit;git pull --rebase origin main 则是把你的本地提交“重放”到远程最新 commit 之后,历史更干净。
但要注意:git rebase 会改写你本地 commit 的 hash。如果你已经把本地分支分享给同事、或者 CI 流水线依赖了旧 commit ID,就别用它。
遇到冲突时,解决后运行:git add 文件名,再 git rebase --continue。全程不要 git commit,那是 merge 流程才需要的。
GitHub 仓库备份技能 - 将 OpenClaw 工作空间自动或手动备份至 GitHub 私有仓库。支持自动定时备份和手动交互式配置,引导完成 Token 配置、仓库创建、首次备份及定时任务设置。用途:(1) 首次设置 (2) 日常备份。
git push --force-with-lease 什么情况下能用
它比 git push -f 安全:只在远程分支没被别人更新的前提下才覆盖。适合你重写了本地历史(比如 git rebase -i 或 git commit --amend),又确认这个分支没人协作(例如你自己的 feature/xxx)。
执行前务必先 git fetch origin。如果 git push --force-with-lease origin main 报 “stale info”,说明远程已有新提交——这时必须切回 pull 或 rebase 方案,不能硬来。
对 main、develop 等受保护分支,GitHub/GitLab 默认禁用强制推送,即使加 --force-with-lease 也会被拒绝。得走 PR/MR 流程。
新建仓库时直接 push 失败,大概率是因为远程已有文件
比如你在 GitHub 创建仓库时勾选了 “Add a README file”,而你本地是 git init && git add . && git commit 后直接 git push——Git 发现远程有 README.md,你本地没有,就拒绝。
解法很简单:git pull --allow-unrelated-histories origin main(注意加 --allow-unrelated-histories,因为两边历史完全无关)。之后再 git push -u origin main 就行。
这个参数只在首次同步两个无关联历史时需要,后续再 push 就不需要了。漏掉它会报 “refusing to merge unrelated histories”。










