2017-02-15 77 views
1

我有一个很长的线性git历史。我想重新绑定一些提交,所以就好像我创建了一个功能分支,并使用git merge --no-ff master将它合并回主。断线git提交到两个合并分支

当前

A -> B -> C -> D -> E -> F 
         master 

期望

    master 
A -> B -> E -> F 
     \ /
     C -> D 
      feature 

我认为做这样的事情

git checkout D 
git checkout -b feature 
git rebase B 
git merge --no-ff E 

D已经在它的历史B,所以这并不做任何事情。我知道如何将E关闭BSplit a git branch into two branches?),但在这里,所需版本的E有两个父母。

一些额外的细节是,最初我的项目结构像Desired,而E是一个真正的合并提交。我以某种方式然后使用git rebase线性化我的历史记录,以从旧提交中删除一些不需要的文件。

回答

1

您可以通过重置师傅B这样做是为了能够创建合并提交E

git checkout D 
git checkout -b feature 
git checkout master 

         master 
A -> B -> C -> D -> E -> F 
       feature 

git reset --hard B 

    master 
A -> B 
     \  
     C -> D 
      feature 

git merge --no-ff feature 

       master 
A -> B -> E 
     \ /
     C -> D 
      feature 

git cherry-pick F 

        master 
A -> B -> E -> F 
     \ /
     C -> D 
      feature 

也许不是最短的解决方案,但它在正确的顺序做事情,所以它更容易理解。

注意:不要忘记将F的散列保存为git reset --hard B将使它成为一个悬而未决的提交。

0
git checkout -b feature D 
git checkout -b master F 
git rebase -i B # change pick C, pick D to drop C, drop D 
git merge D