Menu
CoddyTech

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 课程也会一步步讲解如何使用远程仓库。

Coddy 编程语言插图

在 Coddy 学习 Git

开始