2017-02-15 22 views
1

私は長い直線のgit履歴を持っています。いくつかのコミットを再構築したいので、フィーチャーブランチを作成し、git merge --no-ff masterを使用してマスターに戻してマージしたようにします。 ブレイクリニアgitは2つのマージされたブランチにコミットします

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

理想

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

現在

は私が

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

しかしDはすでにその歴史の中でBを持っているような何かをすると考えられ、これは何もしません。私はEBSplit a git branch into two branches?)から除外する方法を知っていますが、ここではEに2つの親があります。

いくつかの追加の詳細は、もともとは私のプロジェクトがDesiredのように構造化されていて、Eは本当にマージコミットです。私は何とかして、古いコミットからいくつかの不要なファイルを削除するためにgit rebaseを使って自分の履歴を線形化しました。

答えて

1

あなたはEをコミットマージを作成できるようにBにマスターをリセットすることによってこれを行うことができます。

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 

おそらく最短の解決策ではないかもしれませんが、それは正しい順序で物事を行うため、理解しやすくなります。

注:git reset --hard BとしてどこかFのハッシュを保存することを忘れないでください、それがコミットダングリングになるようになります。

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 
関連する問題