重置,分支和合并后无法推送主服务器

时间:2011-10-11 15:53:21

标签: git

我做了一些不稳定的提交更改,也被推送了。我想象的提交树如下:

  

A - > B - > C - > d

提交“A”是最新的稳定提交。在发现后来的更改不稳定后,我使用

返回到上一个稳定版本
  

git checkout A

然后我用

创建了一个新的“稳定”分支
  

git checkout -b stable

继续在那个分支工作。现在我想合并到master,但我不想删除以前的更改,所以我想将它们添加到新分支而不是使用revert。按照this thread中的建议,我从主分支机构做了以下工作:

  

git branch unstable

     

git reset --hard HEAD~3

所以现在HEAD指向提交A,新分支“不稳定”从提交B开始。但我想合并我的稳定更改(在分支“稳定”),所以我使用

  

git merge stable

它成功完成且没有冲突,HEAD现在指向合并稳定更改的最新版本。我现在可以将所有分支推送到我的存储库,除了master,它报告非快进错误。如果我拉,它似乎拉了我之前的所有不稳定的变化。

似乎有大量的帖子与此相似,但似乎大多数人只想使用revert撤消他们拥有的提交,而我想保留我的不稳定提交,但是在一个单独的分支中,因为我现在拥有它。我做错了什么?

1 个答案:

答案 0 :(得分:1)

这里的关键问题是其他人是否正在使用您的主分支,并且可能已经获取该版本。如果没有,那么你可以安全地进行“强制”推送,这将覆盖旧版master。你可以用:

来做到这一点
 git push -f origin master

但是,如果有人可能使用了master分支,则您不想重写公共历史记录。在这种情况下,你可以这样做:

 git fetch origin
 git merge -s ours origin/master
 git push origin master

“我们的”合并策略表示创建合并提交,但忽略您要合并的所有内容(即您的旧主分支)。然后,您的历史记录将包含masterorigin的历史记录,因此您无需使用-f--force)选项即可推送它。

当然,在这两种情况下,您的unstable分支仍将在本地存在。