Break线性git提交到两个合并的分支

时间:2017-02-15 16:28:51

标签: git

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

当前

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,所以这并没有做任何事情。我知道如何从ESplit a git branch into two branches?)重新B,但在这里,E的所需版本有两个父母。

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

2 个答案:

答案 0 :(得分:1)

您可以通过将master重置为private static final String SERVER_DATE_FORMAT = "yyyy-MM-dd HH:mm:ssZ"; public static Date javaDateFromStringDate(String stringDate) throws ParseException { SimpleDateFormat format = new SimpleDateFormat(SERVER_DATE_FORMAT, Locale.getDefault()); return format.parse(stringDate); } 来创建合并提交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会使其成为悬空提交。

答案 1 :(得分: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