web-dev-qa-db-ja.com

git cherry pick-コミットの範囲とその間の一部を除外

私は通常、次のgitコマンドを使用して一連のgerritsをチェリーピックします。いいえ、間にある2つのgerritを除外する方法はありません。以下のコマンドを変更できますか、または一連のgerritを選択して除外できるものはありますか?欲しいです..

git cherrypick fromgerritSHA1..togerritSHA1
27
user2125827

複数の範囲を指定できます。

git cherry-pick A..B C..D E..F

または特定のコミット:

git cherry-pick A B C D E F

除外したいコミットがたくさんある場合は、次のようなことをする方が簡単かもしれません(一種の貧乏人のgit rebase -i for git cherry-pick):

git log --pretty=oneline A..F | tac > tempfile.txt
< edit tempfile.txt to remove the commits you don't want >
git cherry-pick $(awk '{print $1}' tempfile.txt)

編集:git cherry-pickgit logが生成するものとは逆の順序でコミットを確認する必要があるため、tacログに推奨を追加しました(git log --reverse ...も使用できます)。

45
twalberg

個々のコミットをabcdef..123456の範囲からプルできるかどうかはわかりません。 Git範囲の構文は、ドキュメント gitrevisions で説明されており、そのように動作するようには見えません。それでも、範囲ハッシュと除外するハッシュのみを使用して必要なものを取得する別の方法があります。

範囲[fromgerritSHA1..togerritSHA1]内の2つのハッシュがskiphash1skiphash2であると想定しない場合は、次のように試してください。

$ git rev-list --reverse fromgerritSHA1..togerritSHA1 | grep -vE 'skiphash1|skiphash2' | git cherry-pick --stdin

git rev-list --reverse fromgerritSHA1..togerritSHA1は、範囲fromgerritSHA1..togerritSHA1のコミットハッシュを一度に1行ずつ出力します。チェリーピックの正しい順序でハッシュをリストするには、--reverseが必要です。

grep -vE 'skiphash1|skiphash2'は、不要な2つのハッシュをリストから削除します。スキップするハッシュをさらに追加できます。ハッシュは|で区切ります。

最後に、必要なコミットハッシュのみのリストがgit cherry-pick --stdinに渡されます。

3
Rob Bajorek

以下のようなチェリーピック中に問題が発生した場合は、元の試行よりも前に開始ハッシュを選択を試してください。

git cherry-pick a005efa..1ece685
[temp_4454kjerer3233 3520dd4] 3. xxx.
 1 file changed, 9 insertions(+)
[temp_4454kjerer3233 791cec5] 4. xxx.
 3 files changed, 19 insertions(+)
[temp_4454kjerer3233 2e95364] 5. xxx.
 2 files changed, 21 insertions(+)
[temp_4454kjerer3233 59e38b9] 6. xxx.
 3 files changed, 61 insertions(+)
error: could not apply a3b0c6b... 7. xxx.
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
1
János