開発中、別のブランチの部分的な変更を現在のブランチに同期する必要がある場合があります。
以下の図に示すように、devA ブランチのコミット E と F を、下の緑色の devB ブランチに同期したいと考えています。
現時点では、 を使用してこのタスクgit cherry-pick
を。
(チェリーピックには選別・選抜の意味があります)
1. 基本的な使い方
単一のコミットを転送する
git cherry-pick <commitHash>
# 切换到 devB 分支
$ git checkout devB
# Cherry pick 操作
$ git cherry-pick <HashE>
競合が解決された後、コミットできます。
2. 複数のコミットを転送する
同期したい連続コミットが多数ある場合は、次の構文を使用できます。
次のコマンドは、すべてのコミットを E から F に転送できます。順番に書くことに注意してください: コミット E はコミット F より前でなければなりません
git cherry-pick <HashE>..<HashF>
また、上記のコマンドは左閉じで右開きであること、つまり commit_E が含まれていないことに注意してください。両方を含める必要がある場合は、次の構文を使用します。
git cherry-pick <HashE>^..<HashF>
複数の個別のコミットの場合は、次のように記述できます。
git cherry-pick <HashE> <HashG>
3. パラメータ
ドキュメントには次のように書かれています。
usage: git cherry-pick [<options>] <commit-ish>...
or: git cherry-pick <subcommand>
--quit end revert or cherry-pick sequence
--continue resume revert or cherry-pick sequence
--abort cancel revert or cherry-pick sequence
--skip skip current commit and continue
--cleanup <mode> how to strip spaces and #comments from message
-n, --no-commit don't automatically commit
-e, --edit edit the commit message
-s, --signoff add a Signed-off-by trailer
-m, --mainline <parent-number>
select mainline parent
--rerere-autoupdate update the index with reused conflict resolution if possible
--strategy <strategy>
merge strategy
-X, --strategy-option <option>
option for merge strategy
-S, --gpg-sign[=<key-id>]
GPG sign commit
-x append commit name
--ff allow fast-forward
--allow-empty preserve initially empty commits
--allow-empty-message
allow commits with empty messages
--keep-redundant-commits
keep redundant, empty commits
便利な点をいくつか挙げます。
1)-n
複数のコミットを転送し、新しいブランチに 1 つのコミットだけが必要な場合は、コードを自動的に送信せずに-n
パラメータを 。(競合がある場合はあまり役に立たないことに注意してください) (他のブランチから転送されたものであるかどうかを区別するために、新しいブランチを開いてこれらのコミットを同期し、ターゲットのブランチにマージすることができます)
-n, --no-commit don't automatically commit
2)-x
送信情報の最後に行 (コミットから選択されたもの ...) を追加して、送信がどのように生成されたかを後で確認できるようにします。
-x append commit name
3) 「マージ ノード」を同期することはお勧めできません。結果は期待どおりではありません (興味がある場合は、自分で試してみることができます)。
4. コードの競合
1)--continue
同期コードでは必ず競合が発生します。競合を解決した後、変更したファイルを一時記憶域に再度追加しgit add .
、次のコマンドを使用して続行します。
git cherry-pick --continue
2)--abort
処理中に誤操作が発生する可能性があるため、マージを中止して操作前の状態に戻すことができます。
git cherry-pick --abort
(3)--quit
コード競合発生後、チェリーピックを終了しますが、操作前の状態には戻りません。
git cherry-pick --quit