从先前提交的一系列提交中创建Git分支?

41
我有一堆关于一个操作系统项目的提交,我想把最近的20个提交单独提取到另一个分支中,以便我可以发起pull request。
我该如何操作呢?原因是我的提交可能有150个,但其中大部分是针对一个更大的贡献,该贡献还没有准备好。但下一个版本即将发布。
谢谢!
2个回答

111
你可以使用cherry-pick来完成此操作。如果你的long_branch历史记录看起来像这样:
A-B  <-- master
   \
    C-D-E-F-G-H  <-- long_branch

假设您想要将F到H的内容移动到不同的分支,例如short_branch,该分支是基于master的:

git checkout master -b short_branch

提供了

A-B  <-- master, short_branch
   \
    C-D-E-F-G-H  <-- long_branch

那么...(注意提交范围为E..H;该范围的左侧不包括在内)

git cherry-pick E..H

它给出:

    F'-G'-H'  <-- short_branch
   /
A-B  <-- master
   \
    C-D-E-F-G-H  <-- long_branch
注意,这里我用F'G'H'来指代新的提交 - 这是因为虽然它们将包含与FGH相同的有效更改,但它们不会是实际上相同的提交(因为有不同的父级和提交时间)。

3
哇,如果我可以的话,我会点赞两次。这是一个非常简明易懂、不晦涩难懂的例子,涵盖了一些需要注意的细节。谢谢! - dudewad

12

您是否希望保留当前分支的前20个提交?如果不是,请使用以下命令将对当前分支进行20次回溯:

git checkout -b current_branch_save current_branch~20

然后,使用rebase命令将最后20个提交移动。

git checkout current_branch
git rebase --onto another_branch current_branch~20 current_branch

现在你有了current_branch_save,其中包含约100个“准备就绪”之前的提交记录,而current_branch在另一个分支上有最后的20个提交记录。


2
这确实帮助我摆脱了合并冲突。+1 - Daniel Harris
只是想补充一下,您可以使用git rebase --onto another_branch 39ai32^ current_branch命令,其中39ai32是您想保留的最早提交的哈希值。 - silico-biomancer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接