而且如果 push --force
不起作用,你可以执行 push --delete
。看看这个示例的第二行:
git reset --hard HEAD~3
git push origin master --delete
git push origin master
但要小心...
绝对不要回滚公共git历史记录!
换句话说:
- 永远不要在公共仓库上进行
force
push操作.
- 不要执行任何可能破坏他人
pull
的操作.
- 永远不要在别人可能已经拉取的仓库中
重置(reset)
或重写(rewrite)
历史记录。
当然,即使对于这个规则也有极为罕见的例外情况,但在大多数情况下,不需要这样做,并且它会给其他所有人造成问题。
反而应该进行还原(revert)操作。
并且一定要小心你推送到公共仓库的内容。 进行还原操作:
git revert -n HEAD~3..HEAD
git commit -m "sorry - revert last 3 commits because I was not careful"
git push origin master
实际上,回滚和恶意重置的源头HEAD都将包含相同的文件。
编辑以添加更新的信息和更多有关push --force
的论据
考虑使用带租约的强制推送而不是推送,但仍然更喜欢回滚
push --force
可能会带来的另一个问题是,如果有人在你之前推送了任何内容,但在你已经获取之后。如果你现在推送你的变基版本,那么你将会替换他人的工作。
git push --force-with-lease
在git 1.8.5中引入(感谢@VonC在评论中的问题)尝试解决这个特定问题。基本上,如果远程自你最新抓取以来被修改,它会报错并且不会推送。
如果你真的确定需要push --force
,但仍想防止更多问题,那么这是很好的。我甚至可以说它应该是默认的push --force
行为。但仍然远远不能成为强制push
的借口。那些在你的变基之前获取的人仍将遇到许多麻烦,如果你回滚而不是变基,这些问题可以很容易地避免。
既然我们正在谈论git --push
实例...
为什么有人想要强制推送?
@linquize在评论中提供了一个好的强制推送示例:敏感数据。你错误地泄露了不应该被推送的数据。如果你足够快,你可以通过强制推送来"修复"*
它。
*
除非你也进行垃圾收集或者某种方式清理它,否则数据仍将存在于远程。它也有被已经获取的其他人传播的明显潜力,但你知道我的意思。
git push --force
确实是另一种有效的强制推送方式,并且会像在Git的默认push.default config settings
下使用git push origin master --force
一样成功地推送分支,尽管在Git 2.0之前和之后版本中具体推送哪些分支有所不同。 - user456814git push --force
命令运行良好,供参考。 - rogerdpackgit push --force-with-lease
功能更强大 :), 它会在分支状态不符合预期时拒绝更新分支。(参考 https://developer.atlassian.com/blog/2015/04/force-with-lease/) - spoorcc