Как выбрать вишню из удаленной ветки?

У меня возникли проблемы с выполнением набора вишни. На моей локальной машине я нахожусь в моей "мастерской" ветке. Я хочу, чтобы вишневый выбор в фиксации из другой ветки, названной "зебра". Филиал "зебра" является удаленной ветвью.

Итак, статус git:

# On branch master
nothing to commit (working directory clean)

Хорошо, теперь я пытаюсь сделать вишневый захват, который я хочу:

git cherry-pick xyz
fatal: bad object xyz

где "xyz" является сигнатурой коммита, который меня интересует, что произошло на ветке "зебра".

Итак, первый очевидный вопрос: почему нельзя найти коммит, на который я ссылаюсь? Я действительно не понимаю, как это работает в первую очередь, чтобы быть честным. Git хранит что-то вроде базы данных локально в моем рабочем каталоге, для всех остальных ветвей? При выполнении команды cherry-pick, идет ли она и ищет эту локальную базу данных, чтобы найти фиксацию, о которой я говорю?

Поскольку "зебра" является удаленной ветвью, я думал, что у меня нет ее данных локально. Поэтому я переключил ветки:

git checkout zebra
Switched to branch 'zebra'

Итак, теперь, на моей локальной машине, я вижу, что файлы в каталоге правильно отражают состояние зебры. Я вернусь к мастеру, попробую снова выбрать вишневый (надеясь, что данные фиксации доступны сейчас), но я получаю ту же проблему.

У меня есть фундаментальное непонимание того, что происходит здесь, любая помощь будет большой.

Ответ 1

Поскольку "зебра" является удаленной ветвью, я думал, что у меня нет ее данных на местном уровне.

Вы правы, что у вас нет нужных данных, но пытались решить проблему неправильно. Чтобы собирать данные локально из удаленного источника, вам нужно использовать git fetch. Когда вы сделали git checkout zebra, вы переключились на то, что состояние этой ветки было в последний раз, когда вы набрали. Итак, сначала выберите из удаленного:

# fetch just the one remote
git fetch <remote>
# or fetch from all remotes
git fetch --all
# make sure you're back on the branch you want to cherry-pick to
git cherry-pick xyz

Ответ 2

Так же, как приложение к ОП принято ответ:

Если у вас возникли проблемы с

fatal: bad object xxxxx

потому что у вас нет доступа к этому коммиту. Это означает, что у вас нет этого репо, хранящегося локально. Затем:

git remote add LABEL_FOR_THE_REPO REPO_YOU_WANT_THE_COMMIT_FROM
git fetch LABEL_FOR_THE_REPO
git cherry-pick xxxxxxx

Где xxxxxxx - хеш коммита, который вы хотите.

Ответ 3

После объединения ветки разработки в master, я обычно удаляю ветвь разработки. Однако, если я хочу, чтобы вишня выбирала коммиты в ветке разработки, я должен использовать хеш merge commit, чтобы избежать ошибки "плохого объекта".

Ответ 4

Добавление удаленного репо (как "foo"), из которого мы хотим выбрать вишню

$ git remote add foo git://github.com/foo/bar.git

Принеси их ветки

$ git fetch foo

Список их коммитов (это должно перечислить все коммиты в извлечённом foo)

$ git log foo/master

Cherry-выбрать коммит, который вам нужен

$ git cherry-pick 97fedac

Ответ 5

Вам нужно сначала перенести данные ветки на ваш локальный диск.

Что происходит, вы пытаетесь выбрать cherry-pick из ветки-a в branch-b, где в настоящее время вы находитесь на ветке-b, но локальная копия ветки-a еще не обновлена ​​(вам нужно выполнить git сначала потяните обе ветки).

шаги:
- git ветвь check-a
- git pull origin branch-a
- git checkout branch-b
- git pull origin branch-b
- git вишня-pick <hash>

Выход:
[branch-b <hash> ] данные журнала
 Автор: Автор < Автор
 1 файл изменен, 1 вставка (+), 3 удаления (-)

Ответ 6

У меня появилась эта ошибка после использования идентификатора фиксации с вкладки фиксации идентификатора pull-запроса. Затем этот коммит был раздавлен и объединен. В запросе github pull найдите этот текст: "merged commit xxxxxxx into..." вместо того, чтобы пытаться использовать идентификаторы commit на вкладке фиксации.

Ответ 7

Фиксирование должно присутствовать в вашем локальном, проверить, используя git log.

Если коммит не присутствует, попробуйте git fetch чтобы обновить локальный с помощью последнего удаленного.

Ответ 8

Это также может быть легко достигнуто с помощью SourceTree:

  • проверка вашей основной ветки
  • откройте вкладку "Журнал/история"
  • найдите фиксацию xyz и щелкните ее правой кнопкой мыши
  • нажмите "Слияние..."

сделано:)

Ответ 9

Если вы получили, но это все еще происходит, причиной может быть следующее.

Может случиться, что коммит, который вы пытаетесь выбрать, больше не принадлежит какой-либо ветки. Это может произойти, когда вы перебазируете.

В таком случае при удаленном репо:

  1. git checkout xxxxx
  2. git checkout -b temp-branch

Тогда в вашем репо, принесите снова. Новая ветка будет извлечена, включая этот коммит.