如何从另一个分支中选择修改后的提交

时间:2016-07-28 00:40:05

标签: git

我有2个分支,说" branch_1"和" branch_2"像这样:

A <--master
\
 B <--branch_1
  \
   C <--branch_2

现在我在branch_1中进行了更改并修改了HEAD提交。所以现在设置如下:

A <--master
|\
| B_amended <--branch_1
|  
B---C <--branch_2

branch_1上的git log显示在A的HEAD提交之上提交B_amended。在branch_2上的git日志显示提交B和C在HEAD提交之上.Crown_2上的提交B不包含提交的修改B_amended on branch_1。

我的问题是:如何将B_amended带入branch_2以使其看起来像这样?

A <--master
\
 B_amended <--branch_1
  \
   C <--branch_2

现在我正在做:

$ git checkout branch_2
$ git reset --soft HEAD~
$ git stash
$ git rebase branch_1
$ git stash apply
$ git commit

有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

在你的情况下,你可以结帐branch_1和git cherry-pick branch_2,它会将C提交提取到你的branch_1和git reset --soft branch_2的提示上,以将branch_2放到最新的提交上。

你也可以做一个rebase(可能更直接),git rebase --onto branch_1 branch_2~1 branch_2

来自git merge --help:

First let's assume your topic is based on branch next. For example, a feature developed in topic depends on
   some functionality which is found in next.

           o---o---o---o---o  master
                \
                 o---o---o---o---o  next
                                  \
                                   o---o---o  topic


We want to make topic forked from branch master; for example, because the functionality on which topic
   depends was merged into the more stable master branch. We want our tree to look like this:

           o---o---o---o---o  master
               |            \
               |             o'--o'--o'  topic
                \
                 o---o---o---o---o  next

   We can get this using the following command:

       git rebase --onto master next topic

   Another example of --onto option is to rebase part of a branch. If we have the following situation:

                                   H---I---J topicB
                                  /
                         E---F---G  topicA
                        /
           A---B---C---D  master

   then the command

       git rebase --onto master topicA topicB

   would result in:

                        H'--I'--J'  topicB
                       /
                       | E---F---G  topicA
                       |/
           A---B---C---D  master

   This is useful when topicB does not depend on topicA.

答案 1 :(得分:-1)

我确实找到了一个更好的方法:执行交互式rebase并从“branch_2”中删除提交“B”。

所以在“branch_1”中的“B_amended”之后,请执行以下操作:

$ git checkout branch_2
$ git rebase branch_1 -i

在弹出的编辑器中,删除相当于以下内容的行:

pick B

保存并退出

这样做基本上只会在“B_amended”上重播“C”。