协慌网

登录 贡献 社区

如何正确强制推送 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 pull ,然后将git push送到主仓库?你目前正在做的事情(如果我理解得很好)是强迫推动,然后在 “主” 回购中失去你的变化。您应该首先在本地合并更改。