Как выбрать вишню из удаленной ветки?
у меня возникли проблемы при выполнении сливок. На моей локальной машине я в настоящее время нахожусь в своей ветке "master". Я хочу вишневый выбор в фиксации из другой ветви, названной "зебра". Ветка "Зебра" - это удаленная ветка.
Итак, статус git:
# On branch master
nothing to commit (working directory clean)
хорошо, теперь я пытаюсь вишневый выбор фиксации я хочу:
git cherry-pick xyz
fatal: bad object xyz
где " xyz "- это подпись коммита, который меня интересует, что произошло на ветке"зебра".
Итак, первый очевидный вопрос в том, почему git не может найти коммит, на который я ссылаюсь? Я не очень понимаю, как это работает в первую очередь быть честным. Хранит ли git что-то вроде базы данных коммитов локально в моем рабочем каталоге для всех других ветвей? При выполнении команды cherry-pick она идет и ищет эту локальную базу данных, чтобы найти фиксацию, о которой я говорю?
Так как "зебра" является удаленной веткой, я думал, что у меня нет своих данных локально. Поэтому я переключился ветви:
git checkout zebra
Switched to branch 'zebra'
Итак, теперь здесь, на моей локальной машине, я вижу, что файлы в каталоге правильно отражают состояние zebra. Я переключаюсь обратно на master, пытаюсь снова выбрать вишню (надеясь, что данные фиксации теперь доступны), но я получаю ту же проблему.
у меня есть фундаментальное непонимание того, что происходит здесь, любая помощь будет большое.
6 ответов:
поскольку "зебра" является удаленной веткой, я думал, что у меня нет ее данных в местном масштабе.
вы правы, что у вас нет правильных данных, но пытались решить его неправильно. Для локального сбора данных из удаленного источника, нужно использовать
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
просто в качестве дополнения к OP принят ответ:
Если у вас возникли проблемы с
fatal: bad object xxxxxэто потому, что у вас нет доступа к этой фиксации. Это означает, что у вас нет этого РЕПО, хранящегося локально. Затем:
git remote add upstream REPO_YOU_WANT_THE_COMMIT_FROM git fetch REPO_YOU_WANT_THE_COMMIT_FROM git cherry-pick xxxxxxxгде xxxxxxx-это хэш фиксации, который вы хотите.
нужно сначала вытащить оба филиала данных на локальном диске.
то, что происходит,-это ваша попытка выбрать вишню из ветви-a в ветвь-b, где в настоящее время вы находитесь на ветви-b, но локальная копия ветви-a еще не обновлена (вам нужно сначала выполнить git-pull на обеих ветвях).
действия:
- git checkout branch-a
- git pull origin branch-a
- git checkout branch-b
- git pull origin branch-b
- мерзавец подбиратьвыход:
[branch-b] данные журнала
Автор: Автор 1 файл изменен, 1 вставка (+), 3 удаления ( -)
после объединения ветви разработки в master я обычно удаляю ветвь разработки. Однако, если я хочу вишневый выбор коммитов в ветке разработки, я должен использовать merge commit хэш, чтобы избежать ошибки "плохой объект".
Это также может быть легко достигнуто с помощью SourceTree:
- оформить свою ветку master
- откройте вкладку "Журнал / История"
- найдите фиксацию xyz и щелкните правой кнопкой мыши на ней
- нажмите на кнопку " объединить..."
готово :)
эта ошибка была возвращена после использования идентификатора фиксации на вкладке идентификатор фиксации запроса на вытягивание. Эта фиксация была впоследствии раздавлена и объединена. В гитхабе запрос, ищи такой текст: "слился совершить в ХХХХХХХ..."вместо того, чтобы пытаться использовать идентификаторы фиксации с вкладки фиксации.
Comments