チェリーピッキングについて少し説明している 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/
これは古き良き質問であり、上記の回答はそれに答えるのに非常に役立ちましたが、最近この問題に遭遇し、彼の記事が非常に簡潔に述べているので、ここで共有したいと思いました.