1

我正在尝试通过 rebase/cherry-pick 删除最后两个提交。调用后git rebase HEAD^^^ -i,我只留下必要的提交(将所有内容都保留到HEAD^^,所以我放弃了HEAD^and HEAD)。

之后git push我看到以下内容:

! [rejected]        dev -> dev (non-fast-forward)
error: failed to push some refs to 'git@bitbucket.org:XXXXXX/YYYYYYYYY.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate 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 pull只是快进前 HEAD 提交。所以,我结束了我开始的事情。我究竟做错了什么?

4

2 回答 2

5

这不是关于挑选樱桃,而是关于重新定位。在 rebase 之后,您的本地和远程分支将发生分歧,需要合并。Git 永远不会在远程执行合并(除非它是快进合并,这意味着只有一个分支已前进),因此它需要您在本地拉取并执行合并。

问题是,合并不是你想要的。您明确希望丢弃远程分支上的“分歧”提交,并用本地分支的状态覆盖它。

您可以使用 执行此操作git push -f,但仅当您不与其他人共享此分支时才应执行此操作。否则,他们最终会拉下您的更改,将它们与他们自己的分歧副本合并,并重新引入您试图删除的提交。

如果您与可能已签出分支的其他人共享此存储库,您有两个选择

任何一个...

  • 无论如何强制推送,然后联系在该分支上协作的每个人,并建议他们丢弃本地副本。向他们发送此单线,并建议他们隐藏他们可能拥有的任何更改:

    $ git fetch && git checkout dev && git reset --hard origin/dev
    

    这样做之后,他们可能会丢失本地dev分支上的提交;他们可以通过采摘樱桃来恢复它们。

或者...

  • 不要做你想做的事。你不应该在共享分支上重写历史,它只会给其他人带来麻烦。
于 2014-07-16T20:58:37.190 回答
1

这是revert为了什么。您可以还原最后两个提交,这会将旧提交保留在图表中并创建新提交以撤消其内容,这不会重写历史记录但会产生效果。

或者你可以改写历史并承担后果。

于 2014-07-16T23:20:59.263 回答