1572

我已经设置了一个远程非裸“主”存储库并将其克隆到我的计算机上。我做了一些本地更改,更新了我的本地存储库,并将更改推送回我的远程存储库。到那时为止一切都很好。

现在,我不得不更改远程仓库中的某些内容。然后我在本地仓库中更改了一些内容。我意识到不需要对远程仓库进行更改。所以我试图git push从我的本地仓库到我的远程仓库,但我得到了一个错误,比如:

为了防止您丢失历史记录,非快进更新被拒绝在再次推送之前合并远程更改。有关详细信息,请参阅“关于快进的说明”部分git push --help

我想这可能是一个

git push --force

将强制我的本地副本将更改推送到远程副本并使其相同。它确实强制更新,但是当我返回远程仓库并提交时,我注意到文件包含过时的更改(主远程仓库以前拥有的更改)。

正如我在对其中一个答案的评论中提到的:

[我] 尝试强制,但是当返回主服务器以保存更改时,我得到了过时的暂存。因此,当我提交存储库时是不一样的。当我再次尝试使用 git push 时,我得到了同样的错误。

我该如何解决这个问题?

4

9 回答 9

2791

做就是了:

git push origin <your_branch_name> --force

或者如果您有特定的回购:

git push https://git.... --force

这将删除您之前的提交并推送您当前的提交。

这可能不合适,但如果有人偶然发现这个页面,认为他们可能想要一个简单的解决方案......

短旗

还要注意-f是 的缩写--force,所以

git push origin <your_branch_name> -f

也将工作。

于 2012-09-26T21:31:33.550 回答
288

如果push --force不起作用,你可以做push --delete。查看此实例的第 2 行

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(来自revert和来自evil reset)将包含相同的文件。


编辑以添加更新的信息和更多的参数push --force

考虑使用租赁而不是推送来推力,但仍然更喜欢还原

另一个push --force可能带来的问题是当有人在你之前推送任何东西,但在你已经获取之后。如果你现在强制你的rebase版本,你将替换其他人的工作

git push --force-with-leasegit 1.8.5中引入(感谢@VonC对问题的评论)试图解决这个特定问题。基本上,如果在您最近一次获取后修改了遥控器,它将带来错误并且不会推送。

如果您确实确定push --force需要 a ,但仍想防止出现更多问题,这很好。我会说这应该是默认push --force行为。但这还远不是强迫push. 在你 rebase 之前fetch人仍然会有很多麻烦,如果你改为revert就可以轻松避免。

既然我们在谈论git --push实例......

为什么有人要强行推动?

@linquize在评论中带来了一个很好的推动力示例:敏感数据。您错误地泄露了不应推送的数据。如果你足够快,你可以通过强制推动顶部来“修复”它。*

*除非您还进行垃圾收集或以某种方式对其进行清理,否则数据仍将位于远程。它也有明显的潜力被其他已经获取它的人传播,但你明白了。

于 2013-05-22T22:03:25.227 回答
24

如果我在本地分支 A 上,并且我想强制将本地分支 B 推送到源分支 CI 可以使用以下语法:

git push --force origin B:C
于 2015-05-28T18:25:43.740 回答
19

使用以下命令:

git push -f origin master
于 2017-04-10T14:00:18.377 回答
17

首先,我不会直接在“主”存储库中进行任何更改。如果你真的想要一个“主”repo,那么你应该只推送它,不要直接改变它。

关于您遇到的错误,您是否尝试git pull过从本地存储库,然后git push到主存储库?您目前正在做的事情(如果我理解得很好)是强制推送,然后在“主”存储库中丢失您的更改。您应该首先在本地合并更改。

于 2011-04-01T05:42:29.793 回答
11

我真的建议:

换句话说,保持一个可从主服务器和本地计算机访问的裸仓库,以便从/向其拉取/拉取单个上游仓库。

于 2011-04-01T05:53:27.647 回答
6

我有同样的问题,但最终想通了。您最可能需要做的是运行以下两个 git 命令(将 hash 替换为 git commit 修订号):

git checkout <hash>
git push -f HEAD:master
于 2019-04-23T18:02:51.590 回答
5

这是我们在保留历史记录的同时替换公司 gitHub 存储库上的 master 的解决方案。

push -f掌握公司存储库通常被禁用以维护分支历史记录。这个解决方案对我们有用。

git fetch desiredOrigin
git checkout -b master desiredOrigin/master // get origin master

git checkout currentBranch  // move to target branch
git merge -s ours master  // merge using ours over master
// vim will open for the commit message
git checkout master  // move to master
git merge currentBranch  // merge resolved changes into master

将您的分支推送到desiredOrigin并创建 PR

于 2016-05-26T21:31:51.447 回答
1

如果您使用 Github 访问令牌进行身份验证,请尝试以下操作:

  • git remote set-url origin https://YourTokenNum@github.com/UserName/ProjectName

  • git push --force --set-upstream origin master

于 2021-10-15T13:10:17.080 回答