结合GIT中合并分支的历史?

Joc*_*hen 2 git merge branch

在我的git存储库中,我将分支"B"合并到"master"中,获得以下结构:

--> A --> B --> C --> D  (branch master)
    |           |  
    F --> G --> H        (branch B)
Run Code Online (Sandbox Code Playgroud)

我现在想要组合分支以获得以下历史记录:

--> A --> B --> F --> G --> H --> D
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

此致,Jochen

dav*_*ieb 6

我假设C是一个合并提交,这就是你不希望在你的结果中拥有它的原因.

你需要什么,做你想做的,就是git rebase

让我们从另一个原理图提交图开始.为了使原始分支保持完整,我们将在一个名为的新分支上运行rebasing

git checkout -b rebasing master

--> A --> B------------------- --> C --> D         (branch master) (branch rebasing)
     \                           /
      +----+->  F --> G --> H -+                   (branch topic)
Run Code Online (Sandbox Code Playgroud)

只是变基之间的所有内容topic,并rebasingtopic.

git rebase --onto topic topic rebasing
Run Code Online (Sandbox Code Playgroud)

或者用较短的命令做同样的事情

git rebase topic

-> A -> B -----------------> C -> D                (branch master)
    \                      /
     +---+>  F -> G -> H +                         (branch topic)
                          \
                           +---------> B -> D      (branch rebasing)
Run Code Online (Sandbox Code Playgroud)

现在,当我们只看rebasing我们有一个直线的形式AD.

-> A -> F -> G -> H -> B -> D                      (branch rebasing)
Run Code Online (Sandbox Code Playgroud)

所以,现在唯一的问题可能是订单与您的预期不同.git rebase --interactive如果你愿意的话,你可以通过重新订阅提交来轻松解决这个问题.

或者你以一种稍微复杂的方式改变一切.我们重来.

--> A --> B------------------- --> C --> D         (branch master) (branch rebasing)
     \                           /
      +----+->  F --> G --> H -+                   (branch topic)
Run Code Online (Sandbox Code Playgroud)

一是采取一切从C到尖master(亦称D),并把它的尖topic(又名.H):

git rebase --onto topic C master

-> A -> B ----------------> C -> D                (branch master)
    \                      /
     +----> F -> G -> H +                         (branch topic)
                          \
                           +---------> D           (branch rebasing)
Run Code Online (Sandbox Code Playgroud)

最后一个最后一个,我们完成了.

git rebase B

     +----> F -> G -> H +                         (branch topic)
    /                     \
-> A -> B ----------------> C -> D                (branch master)
         \
          +------------------------> F -> G -> H -> D   (branch rebasing)
Run Code Online (Sandbox Code Playgroud)

瞧!

-> A -> B -> F -> G -> H -> D                      (branch rebasing)
Run Code Online (Sandbox Code Playgroud)