git:在合并之前移动提交

git:在合并之前移动提交,git,merge,Git,Merge,我的历史记录树当前如下所示: 我想将提交b3应用于分支主机。当然,我可以再次将分支功能合并到主控中,但两次合并提交(a6,和a4,现在都没用了)会让历史看起来很混乱: 因此,我想知道的是如何使a4现在指向b3而不是b2? 我承认SHA1s将不同,因此提交将从主分支重命名为a4'和a5',您可以简单地重新基于新的b3,同时使用(或-p)保留合并: 这样,当Git重新调整基址时,它不会尝试平坦合并,而是在新的基本提交之上重新创建合并。因此,您的历史将如下所示:

我的历史记录树当前如下所示:

我想将提交
b3
应用于分支主机。当然,我可以再次将分支
功能
合并到
主控
中,但两次合并提交(
a6
,和
a4
,现在都没用了)会让历史看起来很混乱:


因此,我想知道的是如何使
a4
现在指向
b3
而不是
b2

我承认
SHA1
s将不同,因此提交将从主分支重命名为
a4'
a5'

,您可以简单地重新基于新的
b3
,同时使用(或
-p
)保留合并:

这样,当Git重新调整基址时,它不会尝试平坦合并,而是在新的基本提交之上重新创建合并。因此,您的历史将如下所示:

                               master
                                 ↓
a1 -- a2 -- a3 --------- a4' -- a5'
        \                /
         \              /
          b1 -- b2 -- b3
                      ↑
                   feature
与不使用
--preserve merges
标志时的以下情况相比:

                                      master
                                        ↓
a1 -- a2                 a3' -- a4' -- a5'
        \                /
         \              /
          b1 -- b2 -- b3
                      ↑
                   feature

从master,do
git-rebase-p b3
。这将保留合并,但将其移动到
b3
@poke thx!我应该在
a4
状态下执行此操作,或者如果我在
a5
状态下执行此操作,它应该在这两个状态中的任何一个上执行。OP应该(并且,我看到,确实)注意,结果是一个新的(不同的)合并,具有不同的哈希和不同的树。正如您所说,rebase重新创建(即创建一个新的)合并来取代旧的合并。不管怎样,投票结果是一致的。:-)@torek是的,我使用
x'
概念来表示它是基于原始
x
:)重新创建的提交
                                      master
                                        ↓
a1 -- a2                 a3' -- a4' -- a5'
        \                /
         \              /
          b1 -- b2 -- b3
                      ↑
                   feature