我如何正确强制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