回答:
Git 1.7.2では、さまざまなコミットを選択できる機能が導入されました。リリースノートから:
git cherry-pick
コミットの範囲を選択することを学びました(例:cherry-pick A..B
およびcherry-pick --stdin
)git revert
。rebase [-i]
ただし、これらはより良いシーケンス制御をサポートしていません。
コミットからコミットA
までのすべてのコミットをチェリーピックするにはB
(A
はより古いB
)、次のコマンドを実行します。
git cherry-pick A^..B
A自体を無視する場合は、次のコマンドを実行します。
git cherry-pick A..B
(クレジットはコメントでダミアン、JB Rainsbergerとsschaefに行きます)
git cherry-pick A^..B
git cherry-pick f~3
、その後git cherry-pick f~2
などまでgit cherry-pick f
、私はすぐに数と実行を変更することができますので、前のコマンドを取得するまでの矢印を押します(それは、ほとんどのコンソールで似ているはずです)。
git cherry-pick master..somebranch
マスター以降のブランチのすべてのコミットを選択し(すでにマスターに基づいていると仮定)、それらを現在のブランチに適用します。
これを行う最も簡単な方法は、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 checkout secondbranch && git rebase mybranch
完全な回答を追加してもらえますか
rebase
、のインタラクティブモードも使用できます。ありがとう、@ Charles!
--interactive
優れている点は、シーケンスから一部のコミットを削除したり、「チェリーピック」の前にそれらを並べ替えたりできることです。+1
b
これは私にとってはうまくいきました。
あなたはのシリアルを組み合わせて使用することができますgit rebase
し、git branch
別のブランチにコミットのグループを適用します。wolfcによってすでに投稿されているように、最初のコマンドは実際にコミットをコピーします。ただし、グループの一番上のコミットにブランチ名を追加するまで、変更は表示されません。
画像を新しいタブで開いてください...
コマンドをテキスト形式で要約するには:
gitk --all &
。git rebase --onto a b f
。HEAD
マークはありません。git branch selection
これは物事を明確にするはずです:
a
は、グループの新しいルート宛先です。b
は、グループの最初のコミットの前のコミットです(排他的)。f
はグループの最後のコミットです(包括的)。その後、あなたは使用することができますgit checkout feature && git reset --hard b
コミットを削除するc
までf
のfeature
枝。
この回答に加えて、一般的な使用に役立つ別のシナリオのコマンドについて説明するブログ投稿を作成しました。
git rebase --onto a b mybranch
そしてbtw-これらの気の利いたgit画像を実行するプログラムはどれですか。
JB Rainsbergerとsschaefのコメントを適用して質問に具体的に回答するには...この例でチェリーピックの範囲を使用するには:
git checkout a
git cherry-pick b..f
または
git checkout a
git cherry-pick c^..f
git 2.7.0.windows.1
、コミットの範囲をチェリーピックしようとするとすべてが大丈夫ですが、gitはgit cherry-pick --continue | --abort | --quit
コミット/チェリーピックを再度試みる前に行う必要があることをどこにも伝えません。したがって、コミットの範囲を正確に選択git cherry-pick --continue
する場合は、所定の範囲からのコミットで準備が整うたびに(競合を解決するなど)実行する必要があります。
^
後にcが実際にこの場合はBである「Cの前にコミット」を意味します。これがc^..f
と同じ意味b..f
です。試してみるgit log c^..f
と、コミットcからfまでが表示されます。実際と同じですgit log b..f
マージする選択リビジョンがある場合、たとえばA、B、C、D、E、F、G、H、I、JコミットからA、C、F、Jと言う場合は、次のコマンドを使用します。
gitチェリーピックACFJ
git rev-list --reverse b..f | xargs -n 1 git cherry-pick
git cherry-pick {hash of c}; git cherry-pick {hash of d}; ...
ブランチの先端までコミットIDからチェリーピックするには、以下を使用できます。
git cherry-pick commit_id^..branch_name
言及する価値のある別のバリアントはn
、ブランチからの最後のコミット~
が必要な場合、構文が役立つことがあります:
git cherry-pick some-branch~4..some-branch
この場合、上記のコマンドは呼び出されたブランチから最後の4つのコミットを選択しsome-branch
ます(ブランチ名の代わりにコミットハッシュを使用することもできます)
実際、最も簡単な方法は次のとおりです。
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
次のスクリプトは、チェリーピックのソースとターゲットのブランチとコミット数をスクリプトに指示するだけで、複数のコミットを続けてチェリーピックできるようにするスクリプトです。
https://gist.github.com/nickboldt/99ac1dc4eb4c9ff003a1effef2eb2d81
ブランチからマスターにチェリーピックするには(現在のブランチをソースとして使用):
./gcpl.sh -m
6.19.xブランチからマスターへの最新の5つのコミットを選択するには:
./gcpl.sh -c 5 -s 6.19.x -t master
b
ベースにすることもできますがf
、チェリーピッキングとは関係ありません。)