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

时间:2016-01-07 16:46:43

标签: git

好的,所以我在我的分支开发上有一个多提交任务。我必须将这些更改移动到另一个分支(生产),但在大约一个月之前,我们有一个特殊的部署系统 - 在检查了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---

我怎样才能完成它?

1 个答案:

答案 0 :(得分:1)

bd之间插入fg提交并不是一个正常的工作流程,无论VCS使用什么。

如果您不介意在<{strong> b后的d分支上应用提交eprodg,那么git rebase来救援。

git rebase --onto prod a dev

the documentation中所述,上面的命令检出dev分支,保存当前分支(dev)中不在a分支中的提交(即将提交bde)放入临时区域,检出prod分支并按原始顺序逐个应用已保存的提交

如果它没有失败(因为冲突),你的分支将如下所示:

ft1 -----------c--------------
dev ---a---b-------d-------e---
prod --f---------------g---b---d---e

如果失败,您有两种选择:

  • 解决冲突,提交然后运行git rebase --continue;如果需要,请重复,直到所有提交都被重新定位;
  • 通过运行git rebase --abort来中止rebase;这将使存储库恢复其原始状态。

如何达到理想状态

但是,如果您坚持在b之前应用dg次提交,则可以使用git cherry-pick

从提交new开始创建一个新分支(让我们将其命名为f)并将其检出。然后按照您想要的顺序挑选您想要的提交(bdge):

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分支prodnew然后删除您不再需要的任何内容(分支devnew):

git checkout prod
git reset --hard new
git branch -D new dev

如果任何樱桃选择失败,您将拥有与以前相同的两个选项:

  • 解决冲突,提交并继续(git cherry-pick --continue);
  • 或中止所有内容:结帐分支prod并移除分支new