我有一系列提交(20+)属于我想要从我们的主分支中删除到特定功能的特定功能。
我在提交上有一个代表我们最新稳定版本的标记(rel_2009_07_18
),所以当在master上时,git log rel_2009_07_18
.. HEAD获取我想要移动的提交集到一个单独的分支。这个集合中还有一些提交应该保留,但我可以选择那些因为它们很少。
我看过git filter-branch,但是commit选项提到了保留更改但是删除了提交 - 绝对不希望这样。我也查看了git rebase,但是也提到了将提交重新应用到上游分支。
将这些提交移动到单独的分支是否有一个很好的选择?
我不确定这是否是一个可行的选择以及在分布式(尽管很小)(3个开发人员)环境中的影响。但是,我可以执行以下小转变......
想法和建议?谢谢!
答案 0 :(得分:40)
您想要从'master'分支删除提交。如果发布'master'分支(好吧,rel_2009_07_18
发布后提交),并且有人将你的工作基于你的'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来应用原始分支上需要的提交。