好的,所以我在我的分支开发上有一个多提交任务。我必须将这些更改移动到另一个分支(生产),但在大约一个月之前,我们有一个特殊的部署系统 - 在检查了devel上的所有内容后,需要集成新更改的人正在进行新的提交并手动集成它。我不想这样做,但我有两个分支,大约1。5年没有合并,所以我只想移动这些提交,然后创建一个新的开发分支。
树看起来有点像:
ft1 -----------c--------------
dev ---a---b-------d-------e---
prod --f---------------g-------
我希望它是
ft1 -----------c--------------
dev ---a---b-------d-------e---
prod --f---b-------d---g---e---
我怎样才能完成它?
答案 0 :(得分:1)
在b
和d
之间插入f
和g
提交并不是一个正常的工作流程,无论VCS使用什么。
如果您不介意在<{strong> b
后的d
分支上应用提交e
,prod
和g
,那么git rebase
来救援。
git rebase --onto prod a dev
如the documentation中所述,上面的命令检出dev
分支,保存当前分支(dev
)中不在a
分支中的提交(即将提交b
,d
和e
)放入临时区域,检出prod
分支并按原始顺序逐个应用已保存的提交
如果它没有失败(因为冲突),你的分支将如下所示:
ft1 -----------c--------------
dev ---a---b-------d-------e---
prod --f---------------g---b---d---e
如果失败,您有两种选择:
git rebase --continue
;如果需要,请重复,直到所有提交都被重新定位; git rebase --abort
来中止rebase;这将使存储库恢复其原始状态。但是,如果您坚持在b
之前应用d
和g
次提交,则可以使用git cherry-pick
。
从提交new
开始创建一个新分支(让我们将其命名为f
)并将其检出。然后按照您想要的顺序挑选您想要的提交(b
,d
,g
,e
):
git checkout -b new f
git cherry-pick b
git cherry-pick d
git cherry-pick g
git cherry-pick e
如果所有cherry-pick
成功,那么你差不多完成了。 Hard reset分支prod
到new
然后删除您不再需要的任何内容(分支dev
和new
):
git checkout prod
git reset --hard new
git branch -D new dev
如果任何樱桃选择失败,您将拥有与以前相同的两个选项:
git cherry-pick --continue
); prod
并移除分支new
。