web-dev-qa-db-ja.com

複数のコミットを選択する方法

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

これがシナリオの視覚的な説明です(thanks _ jjd _ )。

enter image description here

678
tig

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と入力します。

983
Eric Darchis

これを行う最も簡単な方法はontorebaseオプションを使うことです。現在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
88
CB Bailey

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

git rebase --onto a b f
74
wolfc

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

新しいタブで画像を開いてください...

Workflow

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

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

これは物事を明確にするはずです:

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

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

この答えに加えて、私は ブログ記事 を書きました。これは、一般的にそれを使用するのを助けるべきである別のシナリオのコマンドを説明します。

58
JJD

具体的に質問に答えるためにJ. B. Rainsbergerとsschaefのコメントを適用するには...この例でチェリーピックの範囲を使用するには、次のようにします。

git checkout a
git cherry-pick b..f

または

git checkout a
git cherry-pick c^..f
34
Andy
git rev-list --reverse b..f | xargs -n 1 git cherry-pick
18
Dustin

A、B、C、D、E、F、G、H、I、JのコミットからA、C、F、Jのようにマージする選択的なリビジョンがある場合は、単に以下のコマンドを使用します。

git cherry-pick A C F J

13

実際には、それを行うための最も簡単な方法は次のとおりです。

  1. 2つのブランチ間のマージベースを記録します。MERGE_BASE=$(git merge-base branch-a branch-b)
  2. 古いブランチを新しいブランチに早送りまたはリベースする
  3. 結果のブランチを手順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行(そしてあなたが望む他の行)を削除します

3
ealfonso
git format-patch --full-index --binary --stdout range... | git am -3
3
Roger Wang

コミットIDからブランチの先端までを選択するには、次を使用できます。

git cherry-pick commit_id^..branch_name

2
ut9081

これは、チェリーピックのソースブランチとターゲットブランチ、およびコミット数をスクリプトに指示するだけで、連続して複数のコミットをチェリーピックできるようにするスクリプトです。

https://Gist.github.com/nickboldt/99ac1dc4eb4c9ff003a1effef2eb2d81

ブランチからマスターへチェリーピッキングするには(現在のブランチをソースとして使います):

./gcpl.sh -m

6.19.xブランチから最新の5つのコミットをマスターに選ぶには:

./gcpl.sh -c 5 -s 6.19.x -t master
0
nickboldt