1217

私は2つの枝を持っています。コミットaは一方の頭であり、もう一方はbcdeおよびfの上にありaます。、、、を commit せずに最初のブランチに移動cしたい。チェリー ピックを使用するのは簡単です。最初のブランチを 1 つずつチェリー ピックでチェックアウトし、2 番目のブランチを最初のブランチにリベースします。しかし、1つのコマンドですべてをチェリー ピックする方法はありますか?defbcfcf

以下はシナリオの視覚的な説明です ( JJDに感謝):

ここに画像の説明を入力

4

15 に答える 15

1867

Git 1.7.2 では、さまざまなコミットを選択する機能が導入されました。リリースノートから:

git cherry-pickコミットの範囲を選択することを学びました (例: cherry-pick A..Band cherry-pick --stdin) git revert。ただし、これらはより優れたシーケンス制御をサポートしていませんrebase [-i]

Acommitからcommit までのすべてのコミットをチェリー ピックするにはB(Aは より古いB)、次のコマンドを実行します。

git cherry-pick A^..B

A 自体を無視する場合は、次を実行します。

git cherry-pick A..B

コメントからのメモ:

  • Aよりも古いBA、別のブランチからのものである必要があります。
  • Windows ではA^^..B、キャレットをエスケープする必要があるか、"A^..B"(二重引用符) にする必要があります。
  • zshシェルでは、キャレットは特殊文字であるため、(一重引用符) にする必要があり'A^..B'ます。
  • 説明については、Gabriel Staples による回答を参照してください。

(コメントの damian、JB Rainsberger、sschaef、Neptilo、Pete、および TMin のクレジット。)

于 2010-10-14T13:08:39.700 に答える
129

これを行う最も簡単な方法は、ontoオプションを使用することrebaseです。現在終了しているブランチがamybranch と呼ばれ、これが移動先のブランチであるとしcますf

# checkout mybranch
git checkout mybranch

# reset it to f (currently includes a)
git reset --hard f

# rebase every commit after b and transplant it onto a
git rebase --onto a b
于 2009-11-04T08:13:13.607 に答える
94

または、要求されたワンライナー:

git rebase --onto a b f
于 2011-05-25T15:12:16.107 に答える
77

git rebaseとのシリアルな組み合わせを使用してgit branch、コミットのグループを別のブランチに適用できます。wolfc によって既に投稿されているように、最初のコマンドは実際にコミットをコピーします。ただし、グループの最上位のコミットにブランチ名を追加するまで、変更は表示されません。

写真を新しいタブで開いてください...

ワークフロー

コマンドをテキスト形式で要約するには:

  1. 次のコマンドを使用して、独立したプロセスとしてgitkを開きますgitk --all &
  2. 実行しますgit rebase --onto a b f
  3. gitkF5を押します。何も変わりません。しかし、いいえがマークされています。HEAD
  4. 走るgit branch selection
  5. gitkF5を押します。コミットを含む新しいブランチが表示されます。

これにより、次のことが明確になります。

  • コミットaは、グループの新しいルート宛先です。
  • コミットbは、グループの最初のコミットの前のコミットです (排他的)。
  • コミットfは、グループの最後のコミットです (包括的)。

その後、ブランチからgit checkout feature && git reset --hard bコミットcまでを削除するために使用できます。ffeature

この回答に加えて、別のシナリオでコマンドを説明するブログ投稿を書きました。これは、一般的に使用するのに役立つはずです。

于 2012-09-28T20:30:24.353 に答える
55

JB Rainsberger と sschaef のコメントを適用して具体的に質問に答えるには... この例でチェリーピック範囲を使用するには:

git checkout a
git cherry-pick b..f

また

git checkout a
git cherry-pick c^..f
于 2015-07-26T18:25:40.197 に答える
25
git rev-list --reverse b..f | xargs -n 1 git cherry-pick
于 2009-11-04T03:59:07.277 に答える
-1
git format-patch --full-index --binary --stdout range... | git am -3
于 2009-11-04T01:08:16.123 に答える