Git 使用几乎相同的文件内容将提交从一个分支移动到另一个分支,但提交历史记录完全不同
好的,我的分支devel上有一个多重提交任务。我必须将这些更改转移到另一个分支(生产),但大约一个月前,我们有一个特殊的部署系统-在检查了devel上的所有内容后,需要集成新更改的人正在进行新提交并手动集成。我不想这样做,但我有两个分支在大约1,5年内没有合并,所以我只想移动这些提交,然后创建一个新的devel分支 这棵树看起来有点像:Git 使用几乎相同的文件内容将提交从一个分支移动到另一个分支,但提交历史记录完全不同,git,Git,好的,我的分支devel上有一个多重提交任务。我必须将这些更改转移到另一个分支(生产),但大约一个月前,我们有一个特殊的部署系统-在检查了devel上的所有内容后,需要集成新更改的人正在进行新提交并手动集成。我不想这样做,但我有两个分支在大约1,5年内没有合并,所以我只想移动这些提交,然后创建一个新的devel分支 这棵树看起来有点像: ft1 -----------c-------------- dev ---a---b-------d-------e--- prod --f-------
ft1 -----------c--------------
dev ---a---b-------d-------e---
prod --f---------------g-------
我希望是这样
ft1 -----------c--------------
dev ---a---b-------d-------e---
prod --f---b-------d---g---e---
如何实现这一点?在
f
和g
之间插入b
和d
提交,无论使用何种VCS,都不是一个正常的工作流程
如果您不介意在prod
分支的g
之后应用提交b
、d
和e
,那么就来救援
git rebase --onto prod a dev
如中所述,上述命令将签出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;这将使存储库恢复到其原始状态
g
之前应用b
和d
提交,则可以使用
从commitf
开始创建一个新分支(我们将其命名为new
),并将其签出。然后,按照您想要的顺序选择您想要的提交(b
,d
,g
,e
):
如果所有的cherry pick
s都成功了,那么您就差不多完成了。分支prod
到new
然后删除您不再需要的任何东西(分支dev
和new
):
如果任何一个cherry Pick失败,您有与之前相同的两个选项:
- 要么解决冲突,提交并继续(
)李>git cherry pick--continue
- 或中止所有操作:签出分支
,然后删除分支prod
new
git checkout -b new f
git cherry-pick b
git cherry-pick d
git cherry-pick g
git cherry-pick e
git checkout prod
git reset --hard new
git branch -D new dev