我如何正确强制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
  • 不要resetrewrite某人可能已经拉出的回购历史记录。
  • 当然,即使这条规则也有极少数的例外情况,但在大多数情况下,不需要这样做,它会给其他人带来问题。

    做一个恢复代替。

    并且总是要小心你推到公共回购站的东西 。 回复:

    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到主仓库? 您目前正在做的事情(如果我理解得好的话)会强制推送,然后在“主要”回购中失去您的更改。 您应该首先在本地合并这些更改。

    链接地址: http://www.djcxy.com/p/1351.html

    上一篇: How do I properly force a Git push?

    下一篇: src refspec master does not match any when pushing commits in git