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

现在,我必须在远程回购中更改一些内容。然后,我在本地回购中更改了一些内容。我意识到不需要对远程回购进行更改。所以我尝试从本地回购机向远程回购机进行git推送,但出现了如下错误:

为了防止您丢失历史记录拒绝在再次推送之前合并远程更改。参见“注释”git push的“关于快进”部分--有关详细信息的帮助。

我想那可能是

git push --force

将强制我的本地副本将更改推送到远程副本并使其保持不变。它确实会强制更新,但当我返回到远程回购并提交时,我注意到文件包含过时的更改(主远程回购以前的更改)。

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

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

如何解决此问题?


当前回答

我的问题是——我做到了:

git checkout arbitrary_commit
git push origin master --force

这不是正确的做法。相反,我必须:

git reset HEAD~3
git push origin master --force

注:数字3只是一个例子。你应该输入自己的号码。

其他回答

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

git远程设置url源https://YourTokenNum@github.com/UserName/项目名称git push—force—设置上游原始主机

我的问题是——我做到了:

git checkout arbitrary_commit
git push origin master --force

这不是正确的做法。相反,我必须:

git reset HEAD~3
git push origin master --force

注:数字3只是一个例子。你应该输入自己的号码。

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

git checkout <hash>
git push -f HEAD:master

我真的建议:

仅推送至主回购确保主回购是一个裸回购,以避免主回购工作树与其.git库不同步。请参阅“How to push a local git repository to other computer?”如果您确实需要在主(裸机)存储库中进行修改,请克隆它(在主服务器上),进行修改并推回到它

换言之,保持可以从主服务器和本地计算机访问的裸回购,以便有一个从/从中提取/提取的上游回购。

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

git push --force origin B:C