我想选择要提交给新分支的特定提交集合。
main-branch
* commit8
* commit7
* commit6
* commit5
* commit4
* commit3
* commit2
* commit1
我只想创建具有选定提交的发布分支。
release-branch
* commit7
* commit6
* commit4
* commit2
* commit1
是否可以为所需的提交关联标签,并编写脚本以将带有特定标签的选择提交?
答案 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-branch
和release-branch
之间进行合并可能很困难。因此,您可能必须使用main-branch
或cherry-pick
在发行版和主要开发线之间共享修复程序。