我有一个存储库,它有一些不好的提交(本例中为D,E和F).
ABCDEF主和原点/主
我专门用一个修改了本地存储库git reset --hard
.我在重置之前选了一个分支,所以现在我有一个看起来像的回购:
A-B-C master \ D-E-F old_master A-B-C-D-E-F origin/master
现在我需要这些糟糕提交的一些部分,所以我选择了我需要的位并做了一些新的提交,所以现在我在本地有以下内容:
A-B-C-G-H master \ D-E-F old_master
现在我想把这种状态推到远程仓库.但是,当我尝试做一个git push
Git时,礼貌地给我刷掉了:
$ git push origin +master:master --force Total 0 (delta 0), reused 0 (delta 0) error: denying non-fast forward refs/heads/master (you should pull first) To git@git.example.com:myrepo.git ! [remote rejected] master -> master (non-fast forward) error: failed to push some refs to 'git@git.example.com:myrepo.git'
如何让远程仓库获取本地仓库的当前状态?
如果强制推送没有帮助(" git push --force origin
"或" git push --force origin master
"应该足够),则可能意味着远程服务器通过receive.denyNonFastForwards配置变量拒绝非快进推送(请参阅git config手册页以获取描述),或者通过更新/预接收挂钩.
使用较旧的Git,您可以通过删除" git push origin :master
"(参见分支名称前的':')然后重新创建" git push origin master
"给定分支来解决该限制.
如果你不能改变这个,那么唯一的解决方案就是不是重写历史记录来创建一个恢复 DEF变化的提交:
A-B-C-D-E-F-[(D-E-F)^-1] master A-B-C-D-E-F origin/master
为了补充Jakub的答案,如果你可以访问ssh中的远程git服务器,你可以进入git远程目录并设置:
user@remote$ git config receive.denyNonFastforwards false
然后返回您当地的仓库,再次尝试执行以下提交--force
:
user@local$ git push origin +master:master --force
最后在原始受保护状态下恢复服务器的设置:
user@remote$ git config receive.denyNonFastforwards true