我有一个本地git repo,我最近做了一个提交,然后推送到共享的回购。只有在我把它推到共享仓库后,我才意识到我犯了一个丑陋的错误。我修改了源代码后,我在本地修改了它没有问题:
git commit -C HEAD -a --amend
之后,我尝试了另一个git push origin,我收到以下错误:
! [rejected] mybranch -> mybranch (non-fast forward)
纠正这种情况的最佳方法是什么?
答案 0 :(得分:7)
git不会(默认情况下)允许您将任何“倒带”分支提示的内容推送到分支。换句话说,如果当前分支头不是分支提示的直接父代或祖先,则推送将被拒绝。
您可以尝试使用-f
选项git push
或使用带有前导'+'的refspec来尝试推送,例如git push origin +mybranch:mybranch
。
通常远程存储库仍然不会让这种情况发生,因为如果不同的人可以不分青红皂白地推送不包含他们没有在本地提交的提交的分支提示,则可能会丢失提交。
您可以通过更改远程存储库上的配置参数receive.denyNonFastForwards
来覆盖此行为(假设您具有对远程存储库的适当访问权限)。
如果您没有此类访问权限,可能可以通过删除远程分支并重新创建它来实现此目的。
e.g。
git push origin :mybranch
git push origin mybranch
请注意,更新版本的git包含一个配置参数receive.denyDeletes
,如果设置该参数,将阻止此潜在危险的解决方法工作。
答案 1 :(得分:5)
如果你想强行推动,你可以......嗯......将--force
传递给push
。
但是,在公共存储库中重写历史记录通常被认为是不好的形式。
答案 2 :(得分:2)
在这种情况下,最好只使用修复程序进行第二次提交。由于您已经更改了本地存储库中的原始第一次提交,因此您可能希望从共享存储库中提取它并移动HEAD,以便可以对已更改的提交进行垃圾回收。
答案 3 :(得分:0)
假设您的共享仓库允许,只需在分支名称前加上加号以强制进行非快进推送:
git push origin +mybranch
答案 4 :(得分:-3)
git reset
怎么样?