20

これは私の現在のgitツリーです:

A - H (master)
|
\- B - C - D - E (feature)
           |
           \- F (new)
           |
           \- G (other)

Hそして、サイドブランチをリベースして、以下に依存するようにしたいと思いますA:

A - H (master)
    |
    \- B'- C'- D'- E'(feature)
               |
               \- F'(new)
               |
               \- G'(other)

簡単なコンセプトですが、自動的に行うのは難しいようです。これはすでにここここで尋ねられていますが、提案された解決策は私にとってはうまくいきません。

まず、前者で指摘したようgit branchに、現在のブランチがそこにある場合 (前に追加されている場合)、出力を解析するのは簡単ではありません*。しかし、それはストッパーではありません。私の場合、名前を簡単に提供でき、featurenewother、または現在のブランチが であることを確認できmasterます。

次に、これらのコマンドを試しました:

git rebase --committer-date-is-author-date --preserve-merges --onto master feature^ feature
git rebase --committer-date-is-author-date --preserve-merges --onto master feature^ new
git rebase --committer-date-is-author-date --preserve-merges --onto master feature^ other

そして私は次のようになります:

A - H (master)
    |
    \- E'(feature)
    |
    \- B' - C' - D' - F'(new)
    |
    \- B" - C" - D" - G'(other)

間違いなく私が欲しいものではありません!または、B^代わりにを使用すると、ブランチの履歴feature^も取得します。B - C - Dfeature

それで、これを多かれ少なかれ自動的に行う方法について、さらに何か提案はありますか?

編集:これは次のように機能します:

git checkout feature
git merge other
git merge new
git rebase -p master feature

少なくともツリーは正しく見えるようになりました。マージの前に、ブランチ ヘッドを正しいコミットに移動する必要があります。これは次の方法で実行できます。

git checkout master
git branch -f new feature^2
git branch -f feature feature^1
git branch -f other feature^2
git branch -f feature feature^1
4

4 に答える 4

0

この場合、自動化が本当に必要な立場にあるべきではないと思います。通常、単純なブランチのリベースでも十分な注意が必要です。古いブランチや少数のコミットで実行した場合、成功する可能性は非常に低くなります。そして、あなたはそこに完全な森を持っているようです.

状況がそれほどあいまいでリベースがほとんど機能しない場合でも、インタラクティブなリベース コマンドを発行して todo を手動でカットするだけで数秒しかかかりません。

また、性質上、完全自動の解決策は見当たりません。

しかし、建設的にするために、これは私が解決策を試す方法です:

  • 最初に、ソース履歴を分析してツリー ブランチを表示できるプログラムを作成します。上記の例では、A に対して B..D が返されます。DのE..E; F..G on D.
  • A' を H としてマーク (外部入力から)
  • A に基づく最も低いチャンクを適用します: B..D を A' にチェリー ピック (またはリベース) します。
  • 新しい頂点を D' としてマークします
  • マッピングがすでに行われている残りのチャンクを適用します
于 2013-06-26T09:22:34.357 に答える