git cherry-pick не работает

112

Я пытаюсь выбрать фиксацию от мастера и поместить ее в текущую производственную ветку. Однако, когда я выполняю 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

Ответы:

142

Git разрешает выбор вишни как запретную операцию - все изменения, внесенные этим коммитом, были внесены некоторым коммитом в вашей текущей ветке. (Или, во всяком случае, так думает Git.) Убедитесь, что коммит, который вы выбираете, еще не был каким-то образом объединен, как правильное слияние, rebase / cherry-pick или частичный патч. (Используйте, git show <commit-id>чтобы увидеть разницу.)

cdhowie
источник
16
Спасибо за совет, оказалось, что выбор вишни уже состоялся, и все, что мне нужно сделать, это отправить его на github.
Джей Тейлор
Правильно, я не понимал, что это проверяет содержимое файлов с учетом идентификатора фиксации. Я искал в журнале идентификатор фиксации и не нашел его. оказалось, что он уже был объединен.
mparaz 08
К сожалению, это не единственная причина рассматриваемого вопроса. У меня была точно такая же ситуация, когда у меня была фиксация, которая отменяет некоторую предыдущую фиксацию, и когда я выбрал ее в другой ветке, в какой истории не было отменено этих изменений (т.е. не было отбраковки этой отмененной фиксации ). Конечно, это моя вина. Но в этом случае ожидается, что git выйдет из строя со статусом конфликта, вместо того, чтобы пытаться быть слишком умным, что приведет к путанице пользователя.
Артем Писаренко
Это может произойти, если вы отмените фиксацию слияния, а фиксация, которую нужно выбрать, находится в возвращенной ветке.
матовый
11

В моем случае это сводило меня с ума, поскольку было совершенно очевидно, что конкретная фиксация, которую я хотел выбрать, не была объединена с моей текущей веткой.

Оказывается, кто-то за неделю до этого уже выбрал коммит. Эти изменения , но не конкретный SHA, уже были в моей текущей ветви, и я не заметил их.

Проверьте файлы, которые вы пытаетесь выбрать. Если у них уже есть изменения, версия фиксации уже выбрана или добавлена ​​другим способом. Таким образом, нет необходимости снова собирать вишню.

пкамб
источник
Я почти уверен, что конкретный коммит никогда не находится в вашей ветке, когда он был внесен вишневым выбором, потому что вишневый выбор будет новым хешем, верно? Или я недопонимаю?
msouth
@msouth То, что я изначально взял из других ответов, было «коммит уже был объединен», но я мог видеть, что его нет в моей ветке. Вы правы в том, что Cherry Pick всегда является новым SHA.
pkamb
Да, я думал «конкретная фиксация, как определено хешем», когда набирал это. Мой язык был неточным. Я часто просматриваю вывод, git log --graph --pretty --decorate --onelineчтобы узнать, находится ли данный SHA в моей ветке или нет. См. Мой ответ ниже о том, как вы также можете запутаться, полагая, что сообщение фиксации указывает на изменение - есть ситуация, когда это не так, и это то, что изначально привело меня к этому вопросу. Мозг имеет тенденцию делать эти короткие пути, и они могут иногда возвращаться, чтобы укусить вас.
msouth
6

Также обратите внимание, что добавление .gitkeepв дерево пустого файла (например ) рассматривается cherry-pick как пустая фиксация.

Neamar
источник
В моем случае у меня была фиксация возврата (которая возвращала саму пустую фиксацию) до моей попытки выбора вишни, поэтому я предполагаю, что что-то пустое, вероятно, вызовет это сообщение.
lidkxx 07
3

Итак, вот еще одна запутанная ситуация, в которой это может возникнуть: у меня было следующее:

скриншот журнала git

Я пытался выбрать 9a7b12e, который, по-видимому, ничего не стоит - он даже пытался сказать мне в этой строке в выводе журнала git, что 4497428 - это то, что я действительно хотел. (Я просто искал сообщение о фиксации и взял первый увиденный хэш, в котором оно было). Во всяком случае, просто хочу, чтобы люди знали, что есть еще один способ обмануть вас, пытаясь выбрать неоправданный вариант.

Msouth
источник
10
Не очень полезно для вас понижать голос без объяснения причин - это точное воспроизведение проблемы, которая у меня была, из-за которой я нашел этот вопрос в моем поиске. Если у вас есть рекомендации по улучшению этого, пожалуйста, сообщите мне в комментариях, а не просто голосуйте против.
msouth