У меня проблемы с выбором вишни. На моем локальном компьютере я сейчас нахожусь в своей «главной» ветке. Я хочу выбрать вариант коммита из другой ветки с именем «zebra». Ветка «зебра» - удаленная ветка.
Итак, статус 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. Я снова переключаюсь на мастер, снова пытаюсь выбрать вишню (надеясь, что данные фиксации теперь доступны), но у меня та же проблема.
У меня фундаментальное недопонимание того, что здесь происходит, любая помощь будет отличной.
Ответы:
Вы правы, что у вас нет нужных данных, но вы пытались исправить это неверным способом. Чтобы собирать данные локально из удаленного источника, вам необходимо использовать
git fetch
. Когда вы это сделали,git checkout zebra
вы переключились на то, в каком состоянии эта ветка была в последний раз, когда вы загружали. Итак, сначала загрузите с пульта:источник
Так же, как дополнение к OP принял ответ:
Если у вас проблемы с
это потому, что у вас нет доступа к этой фиксации. Это означает, что у вас нет этого репо, хранящегося локально. Затем:
Где xxxxxxx - хеш фиксации, который вы хотите.
источник
Добавление удаленного репо (как "foo"), из которого мы хотим выбрать вишню
Принесите их ветви
Перечислите их коммиты (в нем должны быть перечислены все полученные коммиты
foo
)Выбери нужный коммит
источник
После слияния ветки разработки с мастером я обычно удаляю ветку разработки. Однако, если я хочу выбрать коммиты в ветке разработки, я должен использовать хеш фиксации слияния, чтобы избежать ошибки «плохой объект».
источник
Сначала необходимо получить данные обеих веток на локальном диске.
Что происходит, так это то, что вы пытаетесь выбрать из ветки-a в ветку-b, где вы в настоящее время находитесь на ветке-b, но локальная копия ветки-a еще не обновлена (вам нужно выполнить git pull on сначала обе ветви).
шаги:
- git checkout branch-a
- git pull origin branch-a
- git checkout branch-b
- git pull origin branch-b
- git cherry-pick <hash>
вывод:
[branch-b <hash>] данные журнала
Автор: Автор <Автор
1 файл изменен, 1 вставка (+), 3 удаления (-)
источник
Мне вернули эту ошибку после использования идентификатора фиксации из вкладки идентификатора фиксации запроса на вытягивание. Эта фиксация была впоследствии раздавлена и объединена. В запросе на перенос на github найдите этот текст: «объединенный коммит xxxxxxx в ...» вместо того, чтобы пытаться использовать идентификаторы фиксации из вкладки коммитов.
источник
Коммит должен присутствовать в вашем локальном каталоге, проверьте с помощью
git log
.Если фиксации нет, попробуйте
git fetch
обновить локальную до последней версии удаленного.источник
Этого также можно легко добиться с помощью SourceTree:
сделано :)
источник
Если вы получили, но это все еще происходит, причина может быть следующей.
Может случиться так, что коммит, который вы пытаетесь выбрать, больше не принадлежит какой-либо ветке. Это может произойти при переустановке.
В таком случае на удаленном репо:
git checkout xxxxx
git checkout -b temp-branch
Затем в своем репо сделайте выборку снова. Будет получена новая ветка, включая этот коммит.
источник
Я решил эту проблему, перейдя в ветку с фиксацией, которую хочу выбрать.
используйте журнал, чтобы найти хеш фиксации
когда вы нашли свой хэш, вырезать и вставить в блокнот. если вы используете команду, просто прокрутите вверх, чтобы получить хэш, затем проверьте ветку, в которую вы хотите поместить фиксацию.
Наконец, вызовите Cherry-Pick из git (note) -x, чтобы добавить ваше сообщение Cherry-Pick к оригиналу. «При записи фиксации добавьте строку с надписью« (вишня, выбранная из фиксации…) »в исходное сообщение фиксации, чтобы указать, из какой фиксации было выбрано это изменение».
источник