如何在GIT中复制没有指定提交的分支?

时间:2016-02-15 22:53:35

标签: git

例如,我有一个主分支,看起来像:

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,但这太令人讨厌......

2 个答案:

答案 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 -bcherry-pick命令使新分支从您想要开始的任何地方开始,并拉入"以保持"提交。请注意,git cherry-pick可能会停止并需要您的帮助,如果某些待保留的提交由于省略的内容而无法按原样应用。