移过提交到他们自己的分支

时间:2013-08-17 21:54:23

标签: git

我有一个看起来像这样的git回购:

   A - B - C - D - E - F
   ^                   ^
   |                   |
Staging              master

我想将Staging分支指针移动到E,但我不希望提交B和D在分支中。我想将B和D放入他们自己的分支。

            Staging
               |
               V
A ---- C ----- E - F <- master
  \               /
   B ----- D -----
           ^
           |
         new branch

我不知道如何将提交移出主分支链并将它们移动到自己的分支,然后再将它们重新合并到master中。

这甚至可能吗?

3 个答案:

答案 0 :(得分:4)

我会使用interactive rebasinggit rebase -i)进行这类转换。

  1. 创建new-branch

    git checkout -b new-branch D
    git rebase -i A^
    
  2. 移动staging

    git checkout staging
    git reset --hard E
    git rebase -i A^
    
  3. 更新master

    git checkout master
    git reset --hard staging
    git merge new-branch
    
  4. 互动式变基

    您可以使用git rebase -i A^(从HEADA获取所有内容)启动交互式变基。您的编辑器将打开并呈现从最旧到最新订购​​的提交(请注意,这与git log的顺序相反,有时会令人困惑)。您可以通过重新排列相应的行来重新排列提交。您还可以删除行,删除关联的提交。 (在你的情况下,删除就足够了。)

    注意:如果您已将历史记录发布给同事,则重新定位会更改您不应该执行的历史记录。

答案 1 :(得分:1)

根据A:

创建两个新分支
git branch staging-new A
git branch new-branch A

然后使用cherry-picking来为每个分支选择你想要的提交:

git checkout staging-new
git cherry-pick C E

和new-branch类似。

然后你可以删除旧的分支Staging。大师保持不变。

注意:

  • 如果任何中间提交是合并提交,那将会更复杂(因为挑选合并提交更复杂)。
  • 由于您正在重新创建分支分段,因此必须更改(通过您或其他人)基于它的任何分支(通常是重新分配)。
  • 你不会得到你所描述的,因为挑选樱桃会创造新的提交。所以staging-new和new-branch 是master的祖先(如你的图片所示)。要获得这一点,您必须使用rebase修改master的历史记录。当然,如果你还没有共享主人,这通常是可取的。

答案 2 :(得分:0)

您希望使用git cherry-pick有选择地将提交从一个分支移动到另一个分支。

本文可能会对您有所帮助:http://technosophos.com/content/git-cherry-picking-move-small-code-patches-across-branches

从git手册:http://git-scm.com/docs/git-cherry-pick