git,在乱糟糟的分支中重新排序提交

时间:2015-12-17 13:13:55

标签: git

我有一个git repo,我想完全重组。

总而言之,我有三个功能,让我们称之为ABC,我一直在努力过去几周不幸的是,关于如何使用分支来正确地分解我的功能,我有点没有意思,而且我甚至在提交之间也从功能跳到功能。

所以现在我有三个分支A_develB_develC_devel,并且在每个分支中有一堆属于三个功能中的每一个的提交。某些功能A的提交还包含B中功能B_devel的一些更改,B中的某些更改A中的C_devel等上。有些提交甚至在master分支中,包含对任何功能的更改。并且所有提交也已经推送到origin

这完全混乱......

...我现在想清理一下。

至少我可以从提交消息中看到,在某些情况下,只是从代码中看到我在每个特定提交中所做的工作。所以我知道哪个提交属于哪个功能。我只需要知道如何将移动提交到相应的正确分支。

//编辑:顺便说一句,我必须提到我是唯一一个在本地和原点上工作的人。所以很可能没有人会因为历史变化而出现问题......以防万一有必要。

2 个答案:

答案 0 :(得分:1)

绝对不是一个好的解决方案,但是如果你要浏览整个日志,理论上你可以使用git cherry-pick <commithash>的组合来从一个分支到另一个分支,git rebase -i(交互式rebase)重新排序分支中的提交。

Read more on this here.

答案 1 :(得分:1)

在阅读其余答案之前请注意以下事项:

  1. git reset或rebase都进行历史重写,因此如果发布了历史记录,则不应使用它们。在您的情况下这不应该是一个问题,因为您是唯一一个使用repo的人。
  2. cherry-pick,从v1.7.1开始,可以挑选多个提交,因此你可以使用它来“抽取”多个提交。
  3. 所以我建议的策略如下。考虑以下结构,该结构在两个分支上具有与特征A和B相关的混合变化:

          A1--A2--B1--B2--A3 (A_Devel HEAD)
         /
    o-o-X (master HEAD)
         \ 
          B3--B4--A4--B5 (B_Devel HEAD)
    

    我们想要的是:

          A1--A2--A3--A4 (A_Devel HEAD)
         /
    o-o-X (master HEAD)
         \ 
          B1--B2--B3--B4--B5 (B_Devel HEAD)
    

    确保所有功能分支都具有所有相关提交+一些不需要的提交

    将与功能A相关的所有提交从B_Devel复制到A_Devel:

    1. git checkout A_Devel
    2. git cherry-pick A4
    3.       A1--A2--B1--B2--A3--A4 (A_Devel HEAD)
           /
      o-o-X (master HEAD)
           \ 
            B3--B4--A4--B5 (B_Devel HEAD)
      
      1. git checkout B_Devel
      2. git cherry-pick B1 B2
      3. 给予

              A1--A2--B1--B2--A3--A4 (A_Devel HEAD)
             /
        o-o-X (master HEAD)
             \ 
              B3--B4--A4--B5--B1--B2 (B_Devel HEAD)
        

        现在删除不相关的提交

        1. git checkout A_Devel
        2. git rebase -i HEAD~~~~(我们想删除B1,B2)
        3. 编辑器打开: pick B1 pick B2 pick A3 pick A4
        4. 删除前两行并保存并退出编辑器。等待rebase完成。

          现在我们将:

                A1--A2--A3--A4 (A_Devel HEAD)
               /
          o-o-X (master HEAD)
               \ 
                B3--B4--A4--B5--B1--B2 (B_Devel HEAD)
          

          同样,对于分支B_Devel:

          1. git checkout B_Devel
          2. git rebase -i HEAD~~~~~~(我们想在最近的6次提交中更改内容)
          3. 编辑器打开: pick B3 pick B4 pick A4 pick B5 pick B1 pick B2
          4. 删除带有A1的行并重新排序剩余的“B”更改,使它们看起来像:

             pick B1
             pick B2
             pick B3
             pick B4
             pick B5
            

            保存,退出,等待rebase完成,最终会给我们:

                  A1--A2--A3--A4 (A_Devel HEAD)
                 /
            o-o-X (master HEAD)
                 \ 
                  B1--B2--B3--B4--B5 (B_Devel HEAD)