例如,我有一个主分支,看起来像:
master -x-x-x-a-x-a-a-x-x-x-x-a-x-x-a-x-x-x-x-a-a-a-x-x
我怎样才能复制' master分支只有名为 X 的提交,没有 A 提交。我知道我可以使用cherry-pick
,但这太令人讨厌......
答案 0 :(得分:1)
除非你有一些自动化标准可以区分A提交和X提交,否则最简单的方法是通过交互式git rebase。假设您要从master
复制的第一个提交是abc123
;做:
git checkout master -b new_branch
git rebase -i abc123^
您的编辑器将打开一个包含所有提交的列表。删除要跳过的那些,然后关闭编辑器。之后,master
将保持不变,new_branch
将指向您的副本。
答案 1 :(得分:0)
您不清楚“'copy'
”的含义(包括您将其放在自己的引号中的原因),但事实上,如果您想要进行一系列现有提交,请转将它们转换为更改集,然后创建一个从一些基本提交开始的分支并获取一些更改集(但不是全部)并从中创建一个新分支,必须是一个副本(根据定义)你很可能需要使用樱桃选择。
我知道我可以使用
cherry-pick
,但这太烦人了......
你不会说出它是如何或为何过于烦人而且#34;但总的来说,诀窍是自动化你想要的樱桃选择。这就是git rebase
所做的:非交互式使用,它只是挑选一切,并以交互方式使用,它会按照一系列樱桃挑选命令打开您选择的编辑器。
您还没有回答有关区分所需提交和不需要的提交的问题。这将是自动化樱桃选择的关键。例如,如果您要保留的每个提交在其单行主题中都包含单词green
,并且/或者您要省略的每个提交都包含单词red
,则可以获取提交列表ID,运行ID以选择保留/丢弃提交,然后对保留的ID运行自动git cherry-pick
:
git rev-list --reverse --topo-order HEAD~20..HEAD > /tmp/all-ids
for id in $(cat /tmp/all-ids); do
if git log -1 --pretty=%s | grep green; then echo $id; fi
done > /tmp/keep-ids
git checkout -b newbranch HEAD~20
git cherry-pick $(cat /tmp/keep-ids)
例如(假设HEAD~20
是保留或丢弃链之前的第一个提交;如果链一直到根提交,你需要稍微修改一下策略bit,以便新分支从一个新的空的孤立分支开始。)
第一行只列出所有候选提交,按提交顺序排序,而不是按任何日期顺序排序(请注意,这也假设没有合并)。
循环for id in ...
遍历所有候选者并选择要保留的候选者。
checkout -b
和cherry-pick
命令使新分支从您想要开始的任何地方开始,并拉入"以保持"提交。请注意,git cherry-pick
可能会停止并需要您的帮助,如果某些待保留的提交由于省略的内容而无法按原样应用。