2011-01-05 6 views
13

サイドブランチを別の(マスターまたは他の)情報から更新して、2つを続行する方法はありますか?リベースと同じですが、そこに古いデータを保存していますか?Gitをマージして別に保管しますか?

オリジナル:

A---B---C---G---H master 
    \   
     D---E---F branchA 

結果:C、G、およびHを、(Jそのマージコミット)KをコミットするようにはまだコミットからbranchA情報を取得

A---B---C---G---H---L master 
    \   \ 
     D---E---F---J---K branchA 

ようサイドブランチ(および将来のコミットLは依然としてマスター上にあります)が、マスターから更新された情報を持っていますか?

ことがで終わるだろうので、私は、リベースを行うにはしたくない:彼らはHの上に起こった代わりにいるかのようにD、E、およびFの「新しいバージョン」を作成

A---B---C---G---H---L master 
       \ 
        D'---E'---F'---K branchA 

Bとの問題は、コミットCとEがレポ内のキーフォルダの名前変更であり、を一緒に崩壊したいと思っていますが、branchAの他の機能の更新はまだマージしていません。リベースとは、Hが新しいフォルダ名を使用し、D 'が古いフォルダ名を作成し、E'が再び削除します。これは最もクリーンではありません。

ポイントは、私は過去にそのフォルダの名前変更(CとE)を取得して、それを前方に持っていきたいと思っています。それは意味がありますか?私はこれを後ろ向きに見ていますか?または、ブランチがマージされるまで、ちょうど汚れたrebase「名前、名前を変更する」トリックを処理する必要がありますか?

+1

git mergeは最も簡単な答えです。私はそれを2つの枝を併合して経験していて、2つを別々に続けることができませんでした...しかし、今は起こっていません! – MidnightLightning

+0

私はあまりにも、git mergeが変更を*単一のブランチにマージするのではなく、2つのブランチを一緒にマージしたと考えました。しかし、私は知りませんでしたが、トピックブランチを作成しました - * B * - 別のトピックブランチ - * A * - をチェックアウトし、* B *を*マスター*にマージしました。 * A *のすべてのコミットをマージします。 –

答えて

14

履歴はbranchA上のマスターとFにHまたはLまで上昇(つまり、JとKがまだ存在しない)、[はい、単純に分岐Aをチェックアウトして、マージした場合:

git checkout branchA 
git merge H # Use H's commit identifier if it's not the tip of master 

これにより、変更がbranchAにマージされ、マスターブランチにまったく影響しません。その後、行うには、もう少し仕事があります、

すでに作成している場合には、Kをコミットし、あなたはそれとFの間のマージを挿入したい:どちらの場合も

git checkout -b temp F # Create a new branch at commit F 
git merge H    # Merge from commit H into the new branch 
git cherry-pick K  # Apply the K commit to the merged commit 

# And the rest simply replaces the temp branch with branchA 
git checkout branchA 
git reset --hard temp 
git branch -d temp 

、後でどちらかの方向にマージした場合コミットHは、両方の履歴ブランチの最も近い共通の祖先になるので、マージする方法を決定するとき、将来のマージはこのコミット(または過去のJからFのいずれか)を見ていません。

1

branchA上の簡単なgit merge masterが行う(またはHがHのcommit-REF Hがマスターの最新でない場合であるgit merge H)必要があります。

CEの両方が解決しなければならない同じ名前のフォルダに名前を変更すると競合が発生しますが、それ以外の場合は問題ありません。

関連する問題