我该如何将一系列提交从主分支移动到另一个分支?

25

我有一系列的提交记录(20+),涉及一个特定的功能。我想将它们从我们的主分支中移除并移到单独的分支中。

在这些提交记录中,有一个标签(rel_2009_07_18),代表我们最新的稳定版本。因此,在主分支上使用git log rel_2009_07_18..HEAD可以得到我要移到单独分支的提交记录集合。其中也有一些提交记录应该保留,但它们很少,可以直接挑选。

我查看了git filter-branch,但commit选项提到要保留更改但删除提交,这肯定不是我想要的。我还查看了git rebase,但它也提到要重新应用提交记录到上游分支。

有没有好的方法可以将这些提交记录移到单独的分支中呢?

我不确定这是否是个可行的方案,并且在分布式环境下(虽然只有3个开发者),是否会产生后果。但我可以进行以下操作:

  1. 将本地的主分支重命名为master_plus_feature(或类似名称)
  2. 从`rel_2009_07_18`标签检出
  3. 从此处创建一个新的master分支
  4. 删除远程分支并从本地重新推送

您有什么想法和建议吗?谢谢!

3个回答

41

您写道想要从'master'分支中删除提交记录。如果'master'分支已发布(即,在rel_2009_07_18之后提交的),并且有人基于您的'master'工作,这可能会导致问题。但是,在您的情况下也许不是一个问题。

下面的两种解决方案都假设您没有未提交的更改。

如果您可以倒退'master'分支:

$ git checkout master
$ git branch separate_branch
$ git reset --hard rel_2009_07_18

现在,“master”分支位于“rel_2009_07_18”标签处,“separate_branch”位于“master”所在的位置。最终结果与您提出的步骤集完全相同(将“master”重命名为“separate_branch”,在“rel_2009_07_18”处重新创建“master”),唯一的区别在于引用日志。

如果您无法回退“主”分支

$ git checkout master
$ git branch separate_branch
$ git checkout rel_2009_07_18 -- .
$ git clean -df
$ git commit -m 'Reverted to state at rel_2009_07_18'

请注意,此解决方案未经测试!结果可能会有所不同。


我可以回退主分支,所以我会选择这个解决方案。我可以通知其他人进行更改。从那里开始,我可以将好的提交选取回主分支,对吗?这样做不会在将 separate_branch 合并回主分支时引起任何真正的问题,对吗? - Eric M.
@Eric M. 是的,您可以在主分支中进行挑选,将“separate_branch”合并到“master”中也不应该有任何问题。 - Jakub Narębski
即使使用了 git push -f 已经发布了,你仍然可以在回退之后强制推送主分支。 - firedev

9
对于我来说,最简单的选项是使用git-cherry-pick
基本上,您需要切换到想要提交的分支,然后使用原始分支的日志(git log master)查找您想要的每个提交的SHA-1,并将其挑选到当前分支。
完成后,您可以返回到主分支,并使用git-reset撤消所有不需要的提交,现在您就拥有了一个带有新提交和干净的主分支的分支。

这绝对是一个非常简单的解决方案!谢谢 :) - Lea Hayes

0
如果历史记录是连续的,创建一个新分支,然后定位到您想要原始分支所在的位置并更新HEAD:
git checkout -b new_branch
git log

Git日志是用来定位原始分割应该在哪里的。

echo {commit id} >.git/refs/heads/original_branch

如果您在此时检出 original_branch,则它将指向新分支应该拆分的提交。

我个人在旧仓库中使用这个方法,因为我没有使用 git-flow 工作流来拆分 develop 和 master 分支,到目前为止我还没有遇到任何问题。

如果历史记录不连续,则同样的方法适用,只是需要找到分支之前的最后一个提交,然后使用 cherry-pick 应用想要在 original_branch 上的提交。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接