我有三个分支:
releaseX 可能是两周前从开发分支出来的。
很久以前topicA 从 develop 分支出来。因为我们知道它最终将合并到发布分支中,所以我们不断将 develop 合并到其中。不幸的是,我们现在在 releaseX 分支中的开发中提交了大量的提交。
以下是我的方案图:
(releaseX)
/
A---B---C---D---E---F---G---H (develop)
\
S---T---X---Y (topicA)
上面,我需要保留S
T
X
Y
这样的提交,但需要摆脱C
和E
。有问题的提交数量大约是50或更多,但显然我无法在这里说明它们。
我的目标是创建一个基于 releaseX 的分支,其中包含来自 topicA 的50多个相关提交。我尝试在 releaseX 上创建一个新分支,然后在 topicA 上重新设置新分支,但这不允许我排除我不想要的提交那里。
根据 releaseX “<樱>挑选”这些50多个提交到 topicA_clean 的最佳方法是什么? < / p>
答案 0 :(得分:5)
此处使用git cherry-pick
的解决方案(适用于git --version
&gt; = 1.7.2):
可以轻松地cherry-pick
提交列表:
$ git cherry-pick -x <commit-hash-1> <commit-hash-2> <...> <commit-hash-X>
我想使用-x
选项以便稍后能够找到原始提交
如果你碰巧有一个你希望cherry-pick
提交的列表,你可以使用一点点命令行魔法:
$ cat cherry-pick-hashes.md | xargs git cherry-pick -x
答案 1 :(得分:1)
这取决于是否有更多的提交要么采取或放弃。
如果您有更多提交,那么您可以根据topicA创建一个新分支,并使用git rebase --interactive HEAD~50
删除您不想保留的提交。
如果您有更多的提交要求,那么您可以自己提交所需的提交。
答案 2 :(得分:1)
考虑到所需的提交数量,一个好的解决方案是使用git rebase --onto
。
说明一下,在合并后将您的情况看起来如下所示,以及强调了四个提交的主题A,E,F,G和H:
o---o---o releaseX
/
o---o---o---E---o---F---H---o---o develop
\ \ \
o-------o---G---o topicA
现在让我们假设你想要的提交是E,F,G和H.这是一个看起来像的图表:
o---o---o---E'---F'---G'---H' releaseX
/
o---o---o---E---o---F---H---o---o develop
\ \ \
o-------o---G---o topicA
首先我们要E,git rebase --onto releaseX E~1 E
现在releaseX现在指向E'。
要获得F和H,git rebase --onto releaseX F~1 H
现在释放X指向H'。
最后,git rebase --onto releaseX G~1 G
完成了任务。
答案 3 :(得分:0)
是否可以在提交 B 时重新设置 topicA ?如果成功,则可以合并topicA_rebased到 releaseX 和 develop ,因为他们三个都有共同的祖先 B 。