私は二つの枝を持っています。コミットa
が1つのヘッドで、もう一方のb
の上にc
、d
、e
、f
、およびa
があります。 c
、d
、e
、およびf
をコミットb
なしで最初のブランチに移動したいです。チェリーピックを使用するのは簡単です。最初のブランチをc
からf
まで順番に1つずつチェックアウトし、2番目のブランチを最初のブランチにリベースします。しかし、1つのコマンドですべてのc
-f
を選択する方法はありますか?
これがシナリオの視覚的な説明です(thanks _ jjd _ )。
Git 1.7.2では、さまざまなコミットをチェリーピックする機能が導入されました。 リリースノートから :
git cherry-pickは、ある範囲のコミットを選ぶことを学びました(例: "cherry-pick A..B"や "cherry-pick --stdin")、そして "git revert"も行いました;これらはより良いシーケンス制御をサポートしませんrebase [-i] "でもね。
重要なコメントを含む(それぞれの作者へのクレジット)
注1: "cherry-pick A..B"形式では、AはBより古くなければなりません。それらが間違った順序である場合、コマンドは静かに失敗します。 - ダミアン
注2: また、これはAをチェリーピッキングするのではなく、むしろAからBまでのすべてを含みます。 - J. B. Rainsberger
注3: Aだけを含めるには、git cherry-pick A ^ .. B - sschaefと入力します。
これを行う最も簡単な方法はonto
にrebase
オプションを使うことです。現在a
で終了するブランチがmybranchで、これが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
または要求されたワンライナー:
git rebase --onto a b f
git rebase
とgit branch
のシリアルな組み合わせを使ってコミットのグループを別のブランチに適用することができます。すでに wolfcによって投稿された 最初のコマンドは実際にコミットをコピーします。ただし、グループの一番上のコミットにブランチ名を追加するまで、変更は表示されません。
新しいタブで画像を開いてください...
コマンドをテキスト形式で要約するには
gitk --all &
を使用して、独立したプロセスとしてgitkを開きます。git rebase --onto a b f
を実行してください。HEAD
はマークされていません。git branch selection
を実行するこれは物事を明確にするはずです:
a
は、グループの新しいルート宛先です。b
は、グループの最初のコミットの前のコミットです(排他的)。f
は、グループの最後のコミット(これを含む)です。その後、c
ブランチからf
までのコミットfeature
を削除するためにgit checkout feature && git reset --hard b
を使用することができます。
この答えに加えて、私は ブログ記事 を書きました。これは、一般的にそれを使用するのを助けるべきである別のシナリオのコマンドを説明します。
具体的に質問に答えるためにJ. B. Rainsbergerとsschaefのコメントを適用するには...この例でチェリーピックの範囲を使用するには、次のようにします。
git checkout a
git cherry-pick b..f
または
git checkout a
git cherry-pick c^..f
git rev-list --reverse b..f | xargs -n 1 git cherry-pick
A、B、C、D、E、F、G、H、I、JのコミットからA、C、F、Jのようにマージする選択的なリビジョンがある場合は、単に以下のコマンドを使用します。
git cherry-pick A C F J
実際には、それを行うための最も簡単な方法は次のとおりです。
MERGE_BASE=$(git merge-base branch-a branch-b)
結果のブランチを手順1のマージベースから始めて自分自身にリベースし、不要なコミットを手動で削除します。
git rebase ${SAVED_MERGE_BASE} -i
あるいは、新しいコミットがわずかしかない場合は、ステップ1を飛ばして単純に
git rebase HEAD^^^^^^^ -i
最初のステップでは、マージベースを通過するのに十分な^
を使用します。
対話式リベースでは、このようなものが表示されます。
pick 3139276 commit a
pick c1b421d commit b
pick 7204ee5 commit c
pick 6ae9419 commit d
pick 0152077 commit e
pick 2656623 commit f
それからb行(そしてあなたが望む他の行)を削除します
git format-patch --full-index --binary --stdout range... | git am -3
コミットIDからブランチの先端までを選択するには、次を使用できます。
git cherry-pick commit_id^..branch_name
これは、チェリーピックのソースブランチとターゲットブランチ、およびコミット数をスクリプトに指示するだけで、連続して複数のコミットをチェリーピックできるようにするスクリプトです。
https://Gist.github.com/nickboldt/99ac1dc4eb4c9ff003a1effef2eb2d81
ブランチからマスターへチェリーピッキングするには(現在のブランチをソースとして使います):
./gcpl.sh -m
6.19.xブランチから最新の5つのコミットをマスターに選ぶには:
./gcpl.sh -c 5 -s 6.19.x -t master