如果我挑选的话,为什么我不能推动这些改变

时间:2014-07-16 20:55:53

标签: git rebase git-rebase cherry-pick git-cherry-pick

我试图通过rebase / cherry-pick删除最后两次提交。在调用git rebase HEAD^^^ -i之后,我只留下必要的提交(将所有内容保留到HEAD^^,因此我放弃HEAD^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提交。所以,我最终得到了我的开始。我做错了什么?

2 个答案:

答案 0 :(得分:5)

不是挑选樱桃,而是关于变基。在rebase之后,您的本地和远程分支将发生分歧,需要合并。 Git永远不会在遥控器上执行合并(除非它是快进合并,意味着只有一个分支已经提前),所以它需要你拉动并在本地进行合并。

问题是,合并并不是你想要的。你明确地想要放弃"分歧"在远程分支上提交,并使用本地分支的状态覆盖它。

您可以使用git push -f执行此操作,但只有在您未与其他人共享此分支时才应执行此操作。否则,他们会结束您的更改,将它们与自己的分散副本合并,并重新引入您尝试删除的提交。

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

要么...

  • 强制推送,然后联系在该分支上合作的每个人,并建议他们丢弃他们的本地副本。发送给他们这个单行,并建议他们存储他们可能有的任何变化:

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

    执行此操作后,他们可能已失去对其本地dev分支的提交;他们可以采摘樱桃来恢复它们。

...或

  • 不要做你想做的事。你不应该在共享分支上重写历史记录,这只会给其他人带来麻烦。

答案 1 :(得分:1)

这是revert的用途。您可以恢复最后两次提交,这将保留旧图片并创建新的提交以撤消其内容,这不会重写历史记录但会产生效果。

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

相关问题