如何将一组提交从主服务器移动到单独的分支?

时间:2009-07-24 15:52:16

标签: git

我有一系列提交(20+)属于我想要从我们的主分支中删除到特定功能的特定功能。

我在提交上有一个代表我们最新稳定版本的标记(rel_2009_07_18),所以当在master上时,git log rel_2009_07_18 .. HEAD获取我想要移动的提交集到一个单独的分支。这个集合中还有一些提交应该保留,但我可以选择那些因为它们很少。

我看过git filter-branch,但是commit选项提到了保留更改但是删除了提交 - 绝对不希望这样。我也查看了git rebase,但是也提到了将提交重新应用到上游分支。

将这些提交移动到单独的分支是否有一个很好的选择?

我不确定这是否是一个可行的选择以及在分布式(尽管很小)(3个开发人员)环境中的影响。但是,我可以执行以下小转变......

  1. 在本地将主分支重命名为master_plus_feature(或类似的......)
  2. 从`rel_2009_07_18`标签
  3. 结帐
  4. 从此点创建新的分支主数据
  5. 删除远程分支并从本地重新推送
  6. 想法和建议?谢谢!

3 个答案:

答案 0 :(得分:40)

您想要从'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',唯一的区别在于reflogs。

如果你不能倒回'主'分支

$ 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'

请注意,此解决方案未经过测试! YMMV。

答案 1 :(得分:9)

对我来说,最简单的选择是使用git-cherry-pick

基本上你需要切换到你想要提交的分支,然后使用原始分支的日志(git log master)你找到你想要的每个提交的SHA-1并将其挑选到现任分支。

完成此操作后,您可以使用git-reset移回主控并反转所有这些不需要的提交,并且您现在拥有一个包含新提交的分支,以及一个干净的主分支。

答案 2 :(得分:0)

如果历史是连续的,请创建一个新分支,然后找到您想要原始分支的分支并更新HEAD:

git checkout -b new_branch
git log

git日志用于找到原始拆分的位置。

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

如果此时检查了original_branch,它将指向新分支应该拆分的提交。

我个人使用这个用于旧的回购,我没有使用git-flow工作流来拆分开发和主分支,到目前为止我没有遇到任何问题。

如果历史不是连续的,那么相同的方法有效,除了必须在分支发生之前找到最后一次提交,然后使用cherry-pick来应用原始分支上需要的提交。