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

Eri*_* M. 25 git

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

rel_2009_07_18在提交上有一个tag()代表我们最新的稳定版本,所以当在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. 删除远程分支并从本地重新推送

想法和建议?谢谢!

Jak*_*ski 40

您写道要从'master'分支中删除提交.如果发布'master'分支(好吧,rel_2009_07_18发布后的提交),并且有人将你的工作基于你的'master',这可能会导致问题.但也许这不是你的问题.

下面的两个解决方案都假设您没有未经修改的更改

如果你可以倒回'master'分支:

$ git checkout master
$ git branch separate_branch
$ git reset --hard rel_2009_07_18
Run Code Online (Sandbox Code Playgroud)

现在'master'位于rel_2009_07_18标签处,'separate_branch'位于'master'的位置.最终结果与您建议的步骤完全相同(将'master'重命名为'separate_branch',重新创建'master'at rel_2009_07_18) ,唯一的区别在于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'
Run Code Online (Sandbox Code Playgroud)

请注意,此解决方案未经过测试!因人而异.


jkp*_*jkp 9

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

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

完成后,您可以通过使用git-reset和嘿presto 回到master并反转所有这些不需要的提交,现在你有了一个包含新提交的分支,以及一个干净的master分支.