如何挑选所选的提交集?

时间:2018-11-20 13:09:54

标签: git github cherry-pick

我想选择要提交给新分支的特定提交集合。

main-branch
* commit8
* commit7
* commit6
* commit5
* commit4
* commit3
* commit2
* commit1

我只想创建具有选定提交的发布分支。

release-branch
* commit7
* commit6
* commit4
* commit2
* commit1

是否可以为所需的提交关联标签,并编写脚本以将带有特定标签的选择提交?

1 个答案:

答案 0 :(得分:4)

tl; dr:使用git rebase -i

可能更好

我想我看不出您期望从标签中得到什么。避免说

git cherry-pick commit

对于每次提交您都会说

git tag my_tag commit

then 仍然必须实际运行脚本以复制提交...比手动完成更多的工作。 (此外,上述标记命令无法按您希望的方式工作,因为给定的标记正好指向一个一个对象;因此,您必须使用许多标记,并找到您的Cherry-Pick脚本他们所有人...)

这并不是说手动摘樱桃是最好的方法。摘樱桃的目的是抓住“我需要的一个改变”。如果您需要处理整个分支,则使用git rebase可能会更容易。 rebase操作经常被误解;它复制提交,很像摘樱桃。 (人们似乎常常认为它“替换”了提交内容,删除了原始内容;这并非完全正确。它可以更改引用的历史记录,但这就是这种程度。)

例如,如果您以

开头
A -- B -- C -- D -- E -- F -- G -- H <--(main-branch)

您可以

git checkout main-branch
git checkout -b release-branch
git rebase -i master~6

(我使用master~6是因为它是一个指向B的表达式; B的对象ID(哈希)也可以使用。我选择了B因为C是您不想保留的第一笔提交-因此重写将在B之后开始。如果要删除A,则可以使用解析为{{1}的表达式}的父母(如果A有父母,或者如果A没有父母,则使用--root。)

现在git将打开一个编辑器,并向您显示一个“待办事项”列表,分支中的每次提交都将一行返回到A(但不包括)。对于您要删除的提交,将提交行的第一个单词从B更改为pick(或删除行)。

退出编辑器时,重新设置操作将开始“复制”提交(即,进行新的提交,并在新的基础上应用相同的更改)。在每个步骤中,都可能存在冲突(如果以后提交中的更改取决于您删除的先前提交中的更改);系统将提示您解决这些问题并继续进行变基操作。

完成后,您将拥有

drop

其中A -- B -- C -- D -- E -- F -- G -- H <--(main-branch) \ D' -- F' -- G' <--(release-branch) D'应用相同的更改,等等。

这并非没有潜在的弊端(尽管D的弊端与rebase的弊端相同);这实际上取决于您将如何处理此处的分支。如果cherry-pick只是您将释放并忘记的终端状态,则可能很好。如果您可能需要修复该发行版,则会发现在release-branchrelease-branch之间进行合并可能很困难。因此,您可能必须使用main-branchcherry-pick在发行版和主要开发线之间共享修复程序。