git cherry-pickが機能しない


110

私はマスターからコミットをチェリーピックして現在の本番ブランチに入れようとしています。ただし、を実行するとgit cherry-pick <SHA-hash>、次のメッセージが表示されます。

# On branch prod_20110801
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#   site/test-result/
 nothing added to commit but untracked files present (use "git add" to track)
 The previous cherry-pick is now empty, possibly due to conflict resolution.
If you wish to commit it anyway, use:

    git commit --allow-empty

Otherwise, please use 'git reset'

注:私はリセットとリセット--hard HEAD ^を試してみましたが、どちらも何も変更していないようです。

なぜこれがうまくいかないのか混乱しています。

これを解決する方法についての洞察、アドバイス、またはアイデアは参考になります〜!


これは私が誤って間違ったコミットをチェリーピックしようとしたときに起こりました。gitkを使用するときに時々起こります。
cst1992

回答:


141

Gitはチェリーピックをノーオペレーションとして解決しています-そのコミットによって導入されたすべての変更は、現在のブランチでのコミットによって導入されたものです。(またはとにかく、それがGitの考えです。)適切にマージする、rebase / cherry-pick、または段階的なパッチのいずれかとして、チェリーを選択しているコミットがまだなんらかの方法でマージされていないことを確認します。(git show <commit-id>差分を確認するために使用します。)


16
アドバイスありがとうございます。すでにチェリーピックが行われていることがわかりました。私がする必要があるのは、それをgithubにプッシュすることだけです。
ジェイテイラー

確かに、commit-idが指定されたファイルの内容をチェックしていることに気づきませんでした。ログでcommit-idを探しに行ったところ、見つかりませんでした。それは既にマージされましたが判明した。
mparaz

問題なく問題の原因はこれだけではありません。以前のコミットを元に戻すコミットがあったときと、別のブランチでチェリーを選択したときに、変更が元に戻されていない履歴(つまり、元に戻されたコミットを正確に選択していなかったとき)とまったく同じ状況になります。 )。もちろん、それは私のせいです。しかし、この場合、あまりにも賢くしようとするのではなく、gitが競合ステータスで失敗するはずであり、ユーザーが混乱することになります。
アルテムピサレンコ2018年

これは、マージコミットを元に戻し、選択したコミットが元に戻されたブランチにある場合に発生する可能性があります。
マット

11

私の場合、チェリーピックしたい特定のコミットが現在のブランチにマージされていないことが明らかだったので、これは私を狂わせました。

誰かがすでに 1週間前にコミットを選択していたことがわかりました。変更はなく、特定のSHAは、私の現在のブランチに存在していた、と私はそれらに気づいていませんでした。

チェリーピックしようとしているファイルを確認してください。すでに変更がある場合は、コミットのバージョンがすでに選択されているか、別の方法で追加されています。したがって、再度チェリーピックする必要はありません。


チェリーピックが新しいハッシュになるので、チェリーピックによってもたらされたときに、特定のコミットがブランチに含まれることはないと確信しています。それとも私は誤解していますか?
msouth 2017年

@msouth私が他の答えから最初に取り除いたのは「コミットはすでにマージされている」ということでした、私のブランチにはないことがわかりました。でも、チェリーピックは常に新しいSHAです。
pkamb

ええ、私はそれをタイプしたとき、「ハッシュによって識別される特定のコミット」を考えていました。私の言葉は不正確でした。の出力をよく振り返ってgit log --graph --pretty --decorate --oneline、特定のSHAが私のブランチにあるかどうかを確認します。コミットメッセージが変更を示すものであると考えて、どのように混同することができるかについては、以下の私の回答を参照してください。そうではない状況があり、それが私が最初にこの質問につながった理由です。人の脳はこれらの近道を作る傾向があり、時々彼らはあなたを噛むために戻ってくることがあります。
msouth 2017年

6

また、空のファイル(など.gitkeep)をツリーに追加すると、cherry-pickは空のコミットと見なします。


私の場合、チェリーピックを試す前に、リバートコミット(それ自体が空のコミットを元に戻していた)があったため、空っぽなものがあると、おそらくこのメッセージが表示されます。
lidkxx 2018年

3

これが発生する可能性のあるもう1つの混乱する状況を次に示します。

git logスクリーンショット

私は明らかに何もない9a7b12eをチェリーピックしようとしました-git log出力のその行で、4497428が本当に欲しかったものであるとさえ教えようとしました。(私がやったことは、コミットメッセージを探して、それが表示された最初のハッシュを取得したことです)。とにかく、あなたに人々に知らせたいのは、あなたが騙されてノーオペレーションを選択しようとする別の方法があるということです。


10
説明なしで反対票を投じるのはあまり役に立ちません。これは、検索でこの質問を見つけるために私が引き起こした問題を正確に再現したものです。これを改善するための推奨事項がある場合は、単に反対票を投じるのではなく、コメントで教えてください。
msouth 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.