チェリーピッキングについて少し説明している StackOverflow のさまざまな投稿を見てきましたが、それらのコードのコメントは、何がブランチで何がディレクトリであるかについてあまり具体的ではありません。例git checkout A -- X Yは私に多くを教えてくれません。
基本的に私はこれが欲しい:
- から新しいブランチを作成
featureAするmaster /tools/my-toolブランチからディレクトリをマージdevするfeatureA
チェリーピッキングについて少し説明している StackOverflow のさまざまな投稿を見てきましたが、それらのコードのコメントは、何がブランチで何がディレクトリであるかについてあまり具体的ではありません。例git checkout A -- X Yは私に多くを教えてくれません。
基本的に私はこれが欲しい:
featureAするmaster /tools/my-toolブランチからディレクトリをマージdevするfeatureA一部のディレクトリを (総当たりチェックアウトではなくコミットとして) チェリーピックする方法に関する元の質問に答えるには、これが可能です。featureAから分岐していて、コミットmasterを引き継ぐことを想像してください。tools/my-tool
/tools/my-tool他のディレクトリからのものと他のディレクトリからのものの両方を含むコミットを行ったことがないことを前提としています
masterこれにより、 へのコミットtools/my-tool(まだ にないものfeatureA) のリストが時系列の逆順で取得されます。
git log --no-merges featureA...master tools/my-tool
別の言い方をすれば:
git log --no-merges source_branch...dest_branch my/firstpath my/secondpath [...]
必要なコミットのみを時系列で取得するには、まず入力行の順序を逆にして ( withtail -rまたは などtac)、コミット ハッシュの列を分離する必要があります ( with などcut)。
git log --format=oneline --no-merges featureA...master tools/my-tool \
| tail -r \
| cut -d " " -f 1
操作全体を一度に行うには、次のようにします。
git cherry-pick $(git log --format=oneline --no-merges featureA...master tools/my-tool | tail -r | cut -d " " -f 1)
ノート:
git cherry-pick完全なコミット (またはコミット) を別のブランチに適用することです。「パス」という概念はありません。git checkout作業ツリーの更新に関するものです(HEADパスが指定されていない場合は、ブランチを効果的に切り替えます)
git checkout [-p|--patch] [<tree-ish>] [--] <pathspec>...
<paths>または--patchが与えられた場合、git checkoutブランチを切り替えません。
作業ツリー内の名前付きパスを、インデックス ファイルまたは名前付き<tree-ish>(ほとんどの場合コミット) から更新します。<tree-ish>引数を使用して特定のツリー (つまり、コミット、タグ、またはツリー) を指定して、作業ツリーを更新する前に、指定されたパスのインデックスを更新できます。
git checkout dev -- tools/my-tool特定のパスを更新しますが、それは「マージ」または「git チェリーピック」ではありません。
Jason Rudolph は、このシナリオと受け入れられた解決策を次の投稿で要約しています。
https://jasonrudolph.com/blog/2009/02/25/git-tip-how-to-merge-specific-files-from-another-branch/
これは古き良き質問であり、上記の回答はそれに答えるのに非常に役立ちましたが、最近この問題に遭遇し、彼の記事が非常に簡潔に述べているので、ここで共有したいと思いました.