Git 使用几乎相同的文件内容将提交从一个分支移动到另一个分支,但提交历史记录完全不同

Git 使用几乎相同的文件内容将提交从一个分支移动到另一个分支,但提交历史记录完全不同,git,Git,好的,我的分支devel上有一个多重提交任务。我必须将这些更改转移到另一个分支(生产),但大约一个月前,我们有一个特殊的部署系统-在检查了devel上的所有内容后,需要集成新更改的人正在进行新提交并手动集成。我不想这样做,但我有两个分支在大约1,5年内没有合并,所以我只想移动这些提交,然后创建一个新的devel分支 这棵树看起来有点像: ft1 -----------c-------------- dev ---a---b-------d-------e--- prod --f-------

好的,我的分支devel上有一个多重提交任务。我必须将这些更改转移到另一个分支(生产),但大约一个月前,我们有一个特殊的部署系统-在检查了devel上的所有内容后,需要集成新更改的人正在进行新提交并手动集成。我不想这样做,但我有两个分支在大约1,5年内没有合并,所以我只想移动这些提交,然后创建一个新的devel分支

这棵树看起来有点像:

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
提交,则可以使用

从commit
f
开始创建一个新分支(我们将其命名为
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