我如何正确强制Git推送?
我已经建立了一个远程的非主要“主”回购,并将其克隆到我的电脑。 我做了一些本地更改,更新了我的本地存储库,并将更改推回到我的远程仓库。 事情到此为止都没有问题。
  现在,我不得不改变远程回购中的一些东西。  然后我在本地回购中改了一些东西。  我意识到,不需要对远程回购进行更改。  所以我试图从我的本地仓库git push到我的远程仓库,但我得到了一个错误: 
  为防止您丢失历史记录,拒绝非快进更新在再次推送前合并远程更改。  有关详细信息,请参阅git push --help的'快速转发注意事项'部分。 
我以为这可能是一个
git push --force
将强制我的本地副本将更改推送到远程副本并使其相同。 它确实会强制更新 ,但是当我回到远程仓库并进行提交时,我注意到这些文件包含过时的更改(主远程仓库之前的更改)。
正如我在其中一个答案的评论中提到的那样:
[我]试图强制,但当回到主服务器保存更改时,我会过时分级。 因此,当我提交存储库是不一样的。 当我尝试再次使用git push时,我得到相同的错误。
我该如何解决这个问题?
做就是了:
git push origin <your_branch_name> --force
或者如果您有特定的回购:
git push https://git.... --force
这会删除以前的提交并推送当前的提交。
这可能是不正确的,但如果有人在这个页面上绊倒,认为他们可能想要一个简单的解决方案...
短旗
  另请注意, -f是--force缩写,所以 
git push origin <your_branch_name> -f
也将起作用。
  如果push --force不起作用,你可以push --delete 。  看看这个实例的第二行: 
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(来自回复和来自邪恶重置 )将包含相同的文件。
  编辑添加更新的信息和围绕push --force更多参数 
考虑用推力而不是推力来推动力量,但仍然更愿意回复
  push --force可能带来的另一个问题是,在你做任何事之前有人推动什么,但是在你已经提取之后。  如果你现在强迫你的重塑版本,你会替换其他人的作品 。 
  在git 1.8.5中引入git push --force-with-lease (感谢@VonC对问题的评论)试图解决这个特定问题。  基本上,它会带来一个错误,而不是推动,如果遥控器自你最近的提取后被修改。 
  如果你确实需要push --force ,但仍希望防止出现更多问题,这很好。  我会尽量说它应该是默认的push --force行为。  但它仍然不是push 。的借口。  在你重组之前获得的人仍然会有很多麻烦,如果你已经恢复了,这很容易避免。 
  因为我们正在谈论git --push实例... 
为什么会有人想要推动?
  @linquize为评论带来了一个很好的推动力例子: 敏感数据 。  您错误地泄露了不应推送的数据。  如果你足够快,你可以“修复” *通过强制在上面推它。 
  *数据将仍然在远程,除非你也做垃圾收集,或以某种方式清理它。  那些已经提取它的人也有明显的潜力,但你明白了。 
首先,我不会直接在“主要”回购库中进行任何更改。 如果你真的想要一个“主”回购,那么你应该只是推动它,不要直接改变它。
  关于你得到的错误,你有没有试过从你的本地仓库中获得git pull ,然后git push到主仓库?  您目前正在做的事情(如果我理解得好的话)会强制推送,然后在“主要”回购中失去您的更改。  您应该首先在本地合并这些更改。 
上一篇: How do I properly force a Git push?
下一篇: src refspec master does not match any when pushing commits in git
