2012-06-20 12 views
6

私たちのgit開発のワークフローでは、トピックブランチはマージされるまで最新のマスターで継続的にリベースされます。リベースを使用するためにマージを使用したgitトピックブランチの履歴を変更しました

しかし、新しい開発者がトピックブランチを作成し、トピックブランチにマスターをいくつかマージして最新の状態に保ちます。

A---B---C---D---E topic 
/ //
    F---G---H---I master 

このトピックブランチをマスターにマージすると、完全に正確になりますが、非常に面倒な履歴になります。私は、単一のコミット--no-ffマージしてマスターにきれいにマージすることができるきれいな線形リベース歴史の中にこれらのトピックブランチを変換するすなわち:

   A'---B'---E' topic 
      /
    F---G---H---I master 

理想的には、私が行うことができますいくつかのgit-FUが存在することになりますこのリベースは、トピックブランチをコミットしたままで、CやDなどのトピックマージコミットですでに利用可能なマージ競合解消情報を自動的に適用します。

私は単純に "git diff master..topic "を使用して、リベースを使用して後方に作業し、手動で単一のパッチを個々のコミットに分割しますが、よりシンプルで洗練されたアプローチがありますか?

私はまっすぐにgit rebasegit rebase -pコマンドを使ってみました。

答えて

4

次のプロセスが完全にはうまくいきませんが、かなりうまくいくようです。軽微な紛争解決が必要になることがあります - 以下を参照してください。

  1. まだ行っていない場合は、トピックブランチはマスターから、最終的なマージを行うことによって、最新のマスターで最新であることを確認します

    git checkout topic 
    git merge master 
    
  2. をすることによってトピックブランチの歴史を簡素化上記ログから

    git log --no-merges 
    
  3. 、(Fをコミットする必要があります最初のトピックブランチをコミットする前に、マスターにコミット)分岐点を決定:マージを除きます。

  4. は、任意の競合を解決する、(すなわち--preserve-merges/-pオプションを使用しない、デフォルトである)マージを無視して、マスターへのトピックブランチをリベース。

    git checkout master 
    git rebase --onto HEAD F topic 
    

    私はリベースの間に、多くの場合、競合ファイルが競合し、「変更の両方」状態であったが、それは何の衝突マーカを含んでいなかったので、簡単なgit addgit rebase --continueを解決するのに十分であったことになることがわかりました紛争と継続。 gitは以前の解決策を使って競合を解決していたと私は信じています。

    さらに複雑なブランチでは、複数のgit rebase --onto HEAD ...コマンドが必要です。あるいは、git cherry-pickコマンドを使用して個々のコミットを選択することもできます。ステップ2で与えられたログを処理し、必要に応じて範囲をHEADにリベースしたり、個々のコミットをチェリーピッキングしたりするだけです。

  5. 現在のHEADは、リベースされたトピックブランチを表すはずです。リベーストピックブランチ名に

    git diff topic..HEAD 
    
  6. 名HEAD:

    git checkout -b rebased-topic 
    
1

ラマンの答えはかなり結果がその出力なしでdiffの結果を確認することで、元のトピックブランチと一致することを確認します私のために働いたが、私は手順4の周りに詳細を追加すると思った。それは私には面倒だった..

私はもっと複雑だったレポを持っていた、それはこのようだった

 Q-R-S-T-U-V-W-X 
    // //
A-B-C-D-E-F-G-H-I-J-K 
私はこれを望んでいた:働いた何
     Q'-R'-S'-T'-U'-V'-W'-X' 
        /
A-B-C-D-E-F-G-H-I-J-K 

はとても基本的に、私は topicにして masterを合併した場所との間にコミットの範囲をつかんで、 git rebase --onto HEAD Q R、その後、 git rebase --onto HEAD S Uを行うことでした。私がこれをしていたときはいつも、私は頭を切った状態だったので、あなたがそれを見ても心配しないでください。紛争を合併したのは数回ありましたが、それは私が期待していた正当な紛争でした。

最後に、私は実際にコミットを移動するために何らかの理由で、マスターに再度リベースする必要があった(ラマンの答えではステップ6)右に見えるブランチを持っていました。なぜ私はそれをしなければならなかったのか分かりませんが、それはスムーズに進みました。

私はこれを基本的にチェリーピッキングと同じだと思うので、そうするのが簡単かもしれません。

+0

ええと、本当にあなたが望んでいたものですか?グラフのS、V、およびXは、マージコミットと見なされるので、希望の状態でS '、V'、およびX 'として存在してはいけません。彼らが手作業による紛争解決の束を含んでいない限り、私はそう思っています。 – Raman

関連する問題