11

次のシナリオがあるとします。

    o (master)   
   /       o--o (WIP1)
  /       /
 o--o--o--o--o--o (WIP2)
(X)       \
           o--o (WIP3)

ブランチ X の後にサブツリーが含まれるように新しいブランチを作成する git コマンドはありますか? 「大規模なリベース」を実行したいのですが、マスターに基づいて 3 つの WIP ブランチをリベースしたいと考えています。

いくつかの Bash スクリプトでそれができることは知っていますが、git コマンドを使用してそれを行う方法を知りたいです。

4

4 に答える 4

15
于 2013-01-24T16:14:17.030 に答える
4

この質問に重複としてフラグを立てました。他の回答で説明したことを書き ますが、あなたの例を使用します。

このようなユースケースで私が使用するアプローチは、移動するすべてのブランチを 1 つの共通の人工ノードにマージしてから、rebase コマンドと--preserve-mergesオプションを使用することです。すべてのブランチをマージすると、 の最終的な入力パラメータとして使用される1 つのエンドポイントが公開rebase --ontoされます。通常、開始点は明白で、移動するサブツリーの起点です。

サブツリー endpointを取得するためにマージする場合、競合は明示的に回避する必要があります。したがって、マージ コマンドは、オプションを使用してそれらを自動的に解決するように指示され-Xoursます。これらの人為的なマージ ノードはリベース後に破棄されるため、マージの結果は重要ではありません。

元の参照が失われないように、新しいブランチパックを作成することをお勧めします。上記の例では、次のコマンドが実行されます。

$ git checkout -b pack WIP1 # create new branch at 'WIP1'
$ git merge -s recursive -Xours WIP2 # merges WIP2 into pack (node p2)
$ git merge -s recursive -Xours WIP3 # merges WIP3 into pack

以下は、ツリーがどうなるかを見ることができます。マージにより、 2 つの新しい人工ノード p2packが作成されました。

      o (master)
     /
    /          (WIP1)  (p2)
   /        o-----o-----o----o (pack)
  /        /           /    /
 o--o--o--o-----o-----o    / (WIP2)
(X)        \              /
            o------------o (WIP3)

いよいよリベースです。すべてのブランチ ( pack ) に共通のエンドポイントがあるため、サブツリー全体を簡単に移動できます。

$ git rebase --preserve-merges --onto master X pack

これが生成されます:

                      (WIP1') (p2')
                   o-----o-----o----o (pack')
   (master)       /           /    /
 o----o----o--o--o-----o-----o    / (WIP2')
(X)               \              /
                   o------------o (WIP3')

ここで、参照を再配置します。理由はわかりませんが、参照が移動される場合と移動されない場合があります。WIP1、WIP2、WIP3、または必要なものごとに、次のように入力します。

$ git checkout WIP1
$ git reset --hard <WIP1' hash>

最後に、共通のサブツリー エンド ノードを生成するために作成された人為的なコミットを取り除きます。

$ git branch -D pack
$ git branch -D p2 # if there is any

したがって、最終的なツリーは次のようになります。

                      (WIP1')
                   o-----o
   (master)       /
 o----o----o--o--o-----o-----o (WIP2')
(X)               \
                   o------------o (WIP3')
于 2017-08-24T12:13:50.500 に答える
2
   o (master)   
   /       o--o (WIP1)
  /       /
 o--p--p--o--o--o (WIP2)
(X)      (Y)
          \
           o--o (WIP3)

これは(「特定のコミットを git の別のブランチに移動する方法rebase --onto」で 1 つの例を見ることができます):

 git rebase --onto master X WIP1
 git rebase --onto master X WIP2
 git rebase --onto master X WIP3

Chronialtestから、次のようになります。

         p'--p'--o--o (WIP2)
        /
 o-----o-----p--p--o--o--o (WIP1)
(X) (master)   (Y')   
        \
         p''--p''--o--o (WIP3)

したがって、最初のリベースは問題ありませんが、Y SHA を取得する必要があります。

 git rebase --onto Y' Y WIP2
 git rebase --onto Y' Y WIP3
于 2013-01-24T15:29:57.017 に答える