修改一个Git提交并推送到共享仓库

5

我有一个本地的git仓库,最近提交了一次,然后推送到了共享仓库。只有在将其推送到共享仓库后,我才意识到犯了一个丑陋的错误。在修正源代码后,我很容易就在本地进行了修订:

git commit -C HEAD -a --amend

之后,我尝试了另一个git push origin,但出现了以下错误:
! [rejected]        mybranch -> mybranch (non-fast forward)

什么是解决这种情况的最佳方法?
5个回答

7

默认情况下,git不允许您将“倒回”分支末端的任何内容推送到分支中。换句话说,如果当前分支头不是分支末端的直接父级或祖先,则会拒绝推送。

您可以尝试使用-f选项向git push推送,或者使用具有前导“+”的refspec,例如git push origin +mybranch:mybranch

通常,远程存储库仍然不会允许此操作,因为您可能会冒失地推送不包括本地未保存的提交的分支末端,从而导致丢失提交。

您可以通过更改远程存储库上的配置参数receive.denyNonFastForwards来覆盖此行为(假设您具有对远程存储库的适当访问权限)。

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

例如:

git push origin :mybranch
git push origin mybranch

请注意,较新版本的git包括一个配置参数receive.denyDeletes。如果设置了该参数,则会防止这种潜在的危险解决方法起作用。

不错,我不知道 denyNonFastForwards:我以为你需要一个钩子来强制执行它。 - araqnid

5
如果您想强制推送,可以在push命令中加上--force参数。但是,在公共存储库上重写历史记录通常被认为是不良行为。

2
在这种情况下,最好的方法可能是使用第二个提交来进行修复。由于您已经在本地仓库中修改了原始的第一个提交,因此您可能需要从共享仓库中拉取它,并移动HEAD以便您的修改后的提交可以被垃圾回收。

0
假设您的共享存储库允许,只需在分支名称前加上加号即可强制进行非快进式推送:
git push origin +mybranch

-3

关于 git reset 怎么样?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接