У меня возникли проблемы с выполнением набора вишни. На моей локальной машине я нахожусь в моей "мастерской" ветке. Я хочу, чтобы вишневый выбор в фиксации из другой ветки, названной "зебра". Филиал "зебра" является удаленной ветвью.
Итак, статус 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
Если вы получили, но это все еще происходит, причиной может быть следующее.
Может случиться, что коммит, который вы пытаетесь выбрать, больше не принадлежит какой-либо ветки. Это может произойти, когда вы перебазируете.
В таком случае при удаленном репо:
git checkout xxxxx
git checkout -b temp-branch
Тогда в вашем репо, принесите снова. Новая ветка будет извлечена, включая этот коммит.