【问题标题】:Break linear git commits into two merged branches将线性 git 提交分成两个合并的分支
【发布时间】:2017-02-15 16:28:50
【问题描述】:

我有很长的线性 git 历史。我想 rebase 一些提交,就好像我创建了一个功能分支并使用 git merge --no-ff master 将其合并回 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,所以这没有任何作用。我知道如何将EB (Split a git branch into two branches?) 中变基,但在这里,所需的E 版本有两个父级。

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

【问题讨论】:

    标签: git


    【解决方案1】:

    您可以通过将 master 重置为 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 将使它成为一个悬空提交。

    【讨论】:

      【解决方案2】:
      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
      

      【讨论】:

        猜你喜欢
        • 2012-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-23
        • 2021-01-18
        • 2014-07-17
        • 2011-11-02
        相关资源
        最近更新 更多