Git Force Push
最后更新
当你的本地分支和远程分支出现分叉时,普通的 git push 会被拒绝,因为 Git 不会覆盖你可能还没看到的提交。强制推送会跳过这项检查,让远程分支和你的本地分支保持一致。改写历史(变基或 amend)之后你就需要它,但它可能会抹掉别人的提交,所以请优先使用更安全的 --force-with-lease。
在终端在线编辑器中试试这些命令:浏览器里就有一个真正的 shell,无需安装任何东西。
语法
| 命令 | 作用 |
|---|---|
git push --force | 覆盖远程分支,没有安全检查 |
git push -f | --force 的简写 |
git push --force-with-lease | 只有在期间没有其他人推送时才强制推送 |
git push --force-with-lease origin feature | 更安全地强制推送到指定分支 |
--force vs --force-with-lease
| 行为 | --force | --force-with-lease |
|---|---|---|
| 覆盖远程分支 | 总是 | 仅当自上次 fetch 以来没有变化 |
| 可能抹掉别人的提交 | 是 | 会拒绝,除非某次 fetch 刷新了租约 |
| 推荐团队使用 | 否 | 是 |
Git 强制推送常见问题
什么时候需要强制推送?
当你改写了已经推送到远程的历史时:比如执行了
git rebase、git commit --amend,或者用交互式变基压缩了提交。你的本地分支和远程的历史不再一致,普通推送会被拒绝,只有强制推送才能更新它。--force 和 --force-with-lease 有什么区别?
--force 会无条件覆盖远程分支,可能悄无声息地删掉队友在你上次 fetch 之后推送的提交。--force-with-lease 只有在远程分支仍停留在你上次看到的那个提交时才会覆盖;如果期间有别人推送过,它会拒绝,从而保护他们的工作。需要注意一点:任何一次 fetch(包括 IDE 在后台自动执行的 fetch)都会刷新租约,所以检查完远程分支后要马上推送。即便如此,在任何共享分支上,它仍然比 --force 更好。强制推送危险吗?
有可能。在共享分支上,直接使用
--force 可能会覆盖别人推送的提交,相当于把他们的工作从远程仓库中删掉。在只有你自己使用的分支上是安全的。拿不准的时候,就用 --force-with-lease,它会安全地失败,而不是覆盖你没看到的更改。如何撤销一次强制推送?
如果旧的提交还在你的本地,或者能在
git reflog 中找到,你可以把分支重置回那些提交,再强制推送一次,恢复之前的状态。这也是使用 --force-with-lease 的又一个理由:它从一开始就大大降低了意外覆盖的可能。可以在线练习吗?
可以。打开终端在线编辑器,就能在浏览器里真正的 shell 中运行 Git 推送命令,无需安装任何东西。Coddy 免费的互动式 Git 课程也会一步步讲解如何使用远程仓库。