如何在 git rebase 后推送到远程?

8

你好,我成功地使用以下命令删除了一个错误提交:

git rebase -p 0df8fg5^ 0df8fg5

我正在 master 分支上工作。但是现在当我执行以下命令时:

git push

会出错提示:

To git@github.com:my_user/my_repo.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'git@github.com:my_user/my_repo.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first merge the remote changes (e.g.,
hint: 'git pull') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

git status的输出如下:

$ git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 3 different commits each, respectively.
#   (use "git pull" to merge the remote branch into yours)
#
nothing to commit, working directory clean

2
规则1:不要对已经推送到其他地方的提交进行变基/修改。如果您仍然想这样做,请参考https://dev59.com/G2865IYBdhLWcg3wIbDM#3968449。 - eckes
1
好的,那么有什么替代方案吗? - tread
1
你需要使用 -f 强制推送,因为答案会告诉你。 - eckes
显然,但这并没有回答问题。你说“不要rebase...”,我问的是在历史记录更早的地方删除特定错误提交的替代方法是什么。 - tread
1
如果您不想强制推送,一旦将提交推送到某个地方,就无法从历史记录中删除该提交。但是,您可以git revert错误的单个提交。这会引入一个新的提交,撤消错误提交的更改,但不会从历史记录中删除错误提交。然后可以安全地推送此更改。 - eckes
这个回答解决了你的问题吗?特性分支变基后Git推送被拒绝 - Organic Advocate
3个回答

5

这段话的意思是,Git认为你已经和主干分支(master)有了不同,因为看起来你在某个点上拥有一些提交(commit),而 origin/master 没有,而且 origin/master 有一些提交(commit)你没有。那个点就是你从本地主干分支(master)中删除提交(commit)的那个点(rebase会更改后续提交(commit)的sha值)。

为了解决这个问题,你需要进行强制推送(force push)但是默认情况下,推送(push)会将你所有的本地分支推到远程相同名称的分支上,这意味着进行强制推送(force push)可能会覆盖其他人的更改。

你可以通过配置设置更改Git的默认行为:

git config --global push.default <setting>

<setting>可以是upstreamcurrentsimple,以防止将本地版本的所有分支推送出去。Git 2之前的默认设置是matching,具有我所说的覆盖行为,而从Git 2开始的默认行为是simple。以下是git手册中描述这些设置实际作用的摘录:

  • current - 推送当前分支以更新接收端同名分支。适用于集中式和非集中式工作流。

  • upstream - 将当前分支推回通常集成到当前分支中的分支(称为@ {upstream})。仅在您要推送到与通常拉取的存储库相同的存储库时才有意义(即集中式工作流)。

  • simple - 在集中式工作流中,像上游一样工作,并添加了一个安全功能,如果上游分支的名称与本地分支不同,则拒绝推送。

    当推送到与您通常拉取的远程不同的远程时,按照当前方式工作。这是最安全的选项,适合初学者。

    此模式将成为Git 2.0的默认设置。

- git-config手册

强制推送的命令是:

git push -f

2

你需要强制推送

git push -f

如果其他人也在使用远程仓库的主分支,那么这将会给他们带来极大的惊讶。并不一定是积极的惊讶。


你的团队成员之前做过什么?在推送后,git status 的确切输出是什么? - SzG

2

在变基之后,通常需要强制推送到远程。

$ git push -f origin master:master

这将强制更新主分支,而不考虑快进。

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