我做了一些不稳定的提交更改,也被推送了。我想象的提交树如下:
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撤消他们拥有的提交,而我想保留我的不稳定提交,但是在一个单独的分支中,因为我现在拥有它。我做错了什么?
答案 0 :(得分:1)
这里的关键问题是其他人是否正在使用您的主分支,并且可能已经获取该版本。如果没有,那么你可以安全地进行“强制”推送,这将覆盖旧版master
。你可以用:
git push -f origin master
但是,如果有人可能使用了master
分支,则您不想重写公共历史记录。在这种情况下,你可以这样做:
git fetch origin
git merge -s ours origin/master
git push origin master
“我们的”合并策略表示创建合并提交,但忽略您要合并的所有内容(即您的旧主分支)。然后,您的历史记录将包含master
中origin
的历史记录,因此您无需使用-f
(--force
)选项即可推送它。
当然,在这两种情况下,您的unstable
分支仍将在本地存在。