如果push --force
不起作用,你可以做push --delete
。查看此实例的第 2 行:
git reset --hard HEAD~3 # reset current branch to 3 commits ago
git push origin master --delete # do a very very bad bad thing
git push origin master # regular push
但要小心...
永远不要回顾公开的 git 历史!
换句话说:
- 永远不要
force
推送公共存储库。
- 不要这样做或任何可能破坏某人的
pull
.
- 永远不要
reset
或rewrite
历史在某人可能已经撤出的回购中。
当然,即使这条规则也有非常罕见的例外,但在大多数情况下,不需要这样做,它会给其他人带来问题。
改为进行还原。
并且始终小心您推送到公共回购的内容。还原:
git revert -n HEAD~3..HEAD # prepare a new commit reverting last 3 commits
git commit -m "sorry - revert last 3 commits because I was not careful"
git push origin master # regular push
实际上,两个原始 HEAD(来自revert和来自evil reset)将包含相同的文件。
编辑以添加更新的信息和更多的参数push --force
考虑使用租赁而不是推送来推力,但仍然更喜欢还原
另一个push --force
可能带来的问题是当有人在你之前推送任何东西,但在你已经获取之后。如果你现在强制你的rebase版本,你将替换其他人的工作。
git push --force-with-lease
在git 1.8.5中引入(感谢@VonC对问题的评论)试图解决这个特定问题。基本上,如果在您最近一次获取后修改了遥控器,它将带来错误并且不会推送。
如果您确实确定push --force
需要 a ,但仍想防止出现更多问题,这很好。我会说这应该是默认push --force
行为。但这还远不是强迫push
. 在你 rebase 之前fetch的人仍然会有很多麻烦,如果你改为revert就可以轻松避免。
既然我们在谈论git --push
实例......
为什么有人要强行推动?
@linquize在评论中带来了一个很好的推动力示例:敏感数据。您错误地泄露了不应推送的数据。如果你足够快,你可以通过强制推动顶部来“修复”它。*
*
除非您还进行垃圾收集或以某种方式对其进行清理,否则数据仍将位于远程。它也有明显的潜力被其他已经获取它的人传播,但你明白了。