将功能分支合并到主服务器后重写历史记录

时间:2018-01-19 07:04:56

标签: git version-control

在我正在处理的个人项目中,我遇到以下情况 -

                                    N'          <-- mainscreen
                                   /
                                  | N--O--P--Q  <-- database
                                  |/
A---B---C---D---------------------M             <-- master
             \                   /
              F--G--H--I--J--K--L               <-- loginscreen

现在虽然我对git有一些基本的经验,但我从来不知道任何好的git实践,也从未参与过一个大型的复杂项目,之前我的技能停滞不前。所以我决定正确地学习它,并遵循这个项目的一些好的做法。快速搜索引导我this,我猜这是所有参考文献中的一个受欢迎的模型。

在阅读完本文后,我意识到由于我的提交中缺乏规划,loginscreen分支中的一些代码实际上是其他分支中需要的公共代码,应该保持独立。所以我决定重写分支的历史记录,以便将公共代码分成新的develop分支。我发现交互式变基可以用来分割提交,但我不确定这是否可行,因为我已经将loginscreen合并到master(这可能是一个坏主意)。基本上我想做的是 -

  1. 根据A,初始提交
  2. 创建一个新分支develop
  3. 移动B,C,D承诺开发
  4. 拆分F - L提交,只有与loginscreen相关的代码在其自己的分支中且公共代码在develop
  5. loginscreen合并到develop
  6. 如果可能,请删除主服务器中的合并提交M
  7. 重新定位新database分支上的mainscreendevelop分支
  8. 结果应该是这样的 -

       A-----------------------M-----------      <-- master        
        \                      | N--O--P--Q      <-- database
         \                     |/
          B---C---D---G--I--K--L                 <-- develop
                   \          / \
                    F---H---J    \               <-- loginscreen
                                  \
                                   N`            <-- mainscreen
    
    (G, I, K commits contain the common code)
    

    就像我说的,这是一个个人项目,并没有被推动,所以重写历史不会有任何问题。但这有可能吗?

1 个答案:

答案 0 :(得分:0)

我很容易用樱桃挑选解决这个问题。我需要做的就是在初始提交时创建一个名为develop的新分支,然后挑选B,C和D.然后我为loginscreen提交创建了一个新分支并且采摘了樱桃,分开了文件,合并分支并在必要时解决合并冲突。所有这一切导致了一个像这样的状态 -

   A----------------------------------      <-- master        
    \                      
     \                             
      B---C---D--G--I--K--L--------------Q        <-- develop
               \   \     /   \          /
                F---H---J     M--N--O--P              <-- loginscreen

在此之后,添加mainscreendatabase分支很简单地将提交内容提交到develop上各自的新分支。

请记住,这将更改提交时间戳,有时还会更改作者时间戳(发生冲突时)。我没有打扰提交,但可以使用git commit --amend --date更改作者时间戳。