为什么我不能推送一个空的提交?

为什么我不能推送一个空的提交?
  git commit --amend --allow-empty

然后

  git push origin master

git 说

! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'remoteurl'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

为什么?如何解决?

答案1

问题不在于你正在推动空的提交。
这是关于推动不同的提交(具有不同的 SHA1)而不是已推送的提交。
这就是它git commit --amend所做的:它修改了最后一个提交,而不是创建新的提交。

这意味着你正在推动不同的历史比其他人可能已经克隆的要多。
如果你确定这不会有问题,你需要强制推送:

git push -f origin master

你应该这样做吗:

git commit --allow-empty

你会创建一个新的(空)提交,您可以毫无问题地推送它。

答案2

如果你想在 Github 上创建 pull request,你可以:

git commit --allow-empty -m "make pull request"

然后创建不做任何改变的拉取请求。

答案3

为了澄清接受的答案,因为我没有足够的声誉来评论:

当你使用

git commit --amend

创建一个新的提交。但是,它不会将其附加到当前提交,而是将其附加到当前提交的父级。从视觉上看,它看起来像一个分支。

  O (old commit)
 /
O-O (amended commit)

Git 将此解释为与远程版本不一致。这就是为什么它不允许您强制推送它。

答案4

确保您尝试推送到的远程分支当前未被签出。我曾经在我的一台服务器上创建了一个 git 存储库,但无法弄清楚为什么我无法推送到它。经过大约一天的故障排除,我发现当它在服务器存储库上被签出时,我无法推送到存储库(或我想要的分支)。因此,我只需创建一个新分支,在服务器上完成更改后签出该分支,然后就可以推送到服务器。这可能不是您的问题,但当我在服务器上推送到空的 git 时遇到问题时,我遇到了类似的错误。

相关内容