在使用 Git 推送代码到远程仓库时,常常会遇到如下错误:
! [rejected] test -> test (non-fast-forward)
error: failed to push some refs to 'http://170.170.170.170/service.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. If you want to integrate the remote changes,
hint: use 'git pull' before pushing again.
✋ 问题解释
这个错误发生的原因是:
- 你本地的分支(如
test
)落后于远程分支的最新提交。 - Git 默认为了保护数据,不允许你直接覆盖(非 fast-forward)远程的更改。
换句话说,远程的 test
分支上可能有别人提交的新内容,而你本地的分支并没有包含这些。
✅ 解决方案
根据你的需求和协作场景,有以下几种处理方式:
方法一:拉取远程更新再推送(推荐)
git pull --rebase origin test
git push origin test
--rebase
会将你的提交临时移除,先合并远程更新,再重新应用你的更改- 优点是:历史更清晰,没有额外的 merge commit
方法二:强制推送(仅限个人项目或确认无远程更改时)
git push --force origin test
⚠️ 警告:这会覆盖远程分支的提交,可能导致其他人的工作丢失!
🔍 查看具体差异(推荐)
你也可以先查看远程分支与本地的差异,确保操作不会造成损失:
git fetch origin
git log HEAD..origin/test --oneline
如果看到有远程提交,你应该先 pull 下来,避免数据丢失。
🧠 总结
操作场景 | 推荐操作 |
---|---|
与他人协作,远程有更改 | git pull --rebase 再 push |
本地变更覆盖远程(确认安全) | git push --force |
不确定差异 | git fetch + git log HEAD..origin/branch |
💡 附加建议
- 配合 GUI 工具(如 Sourcetree)可以更清晰查看差异与分支状态
- 使用分支前建议先
git pull
,保持同步