2009-04-30 92 views
5

我有一个本地git仓库,我最近做了一个提交,然后推送到共享仓库。只有当我把它推到共享回购站后,我才意识到我犯了一个很丑陋的错误。我修改它在本地没有问题后,我定我的源与:修改共享库的Git提交

git commit -C HEAD -a --amend 

在那之后,我尝试另一个混帐推出身,我得到以下错误:

! [rejected]  mybranch -> mybranch (non-fast forward) 

什么是纠正这种最好的方式情况?

回答

7

Git不会(默认)允许你推到一个分支任何“倒带”分支的顶端。换句话说,如果当前的分支机构不是分支机构的直接父母或祖先,那么推送将被拒绝。

您可以尝试使用-f选项至git push,或者使用具有前导'+'的refspec。 git push origin +mybranch:mybranch

通常远程仓库仍然不会让这种情况发生,因为你可能会失去,如果提交不同的人可以肆意地推动枝梢不包括承诺,他们没有在当地有。

您可以通过更改配置参数receive.denyNonFastForwards在远端仓库覆盖此行为(假设你有到远程仓库的appropraite访问)。

如果您没有这种访问权限,您可以可能能够通过删除远程分支并重新创建它来实现此目的。

例如

git push origin :mybranch 
git push origin mybranch 

注意,最近的Git版本包括一个配置参数receive.denyDeletes会,如果设置,防止这种潜在危险的解决方法无法正常工作。

+0

不错,我不知道关于denyNonFastForwards:我以为你需要一个钩子来强制执行。 – araqnid 2009-05-01 01:01:28

5

如果要强制推送,你可以... ... EHM通过--forcepush

但是,它通常被认为是不好的形式重写一个公共仓库的历史。

0

假设你的共享回购允许,只是前缀分支名称与一个加号,以迫使非快速向前推:

git push origin +mybranch 
2

在这种情况下,它可能是最好只是做一个与第二承诺固定。由于您已经更改了本地存储库中的原始第一次提交,因此您可能希望将其从共享存储库中提取出来,并移动HEAD以便您的更改的提交可以被垃圾收集。