Как выбрать из удаленного филиала?

135

У меня проблемы с выбором вишни. На моем локальном компьютере я сейчас нахожусь в своей «главной» ветке. Я хочу выбрать вариант коммита из другой ветки с именем «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. Я снова переключаюсь на мастер, снова пытаюсь выбрать вишню (надеясь, что данные фиксации теперь доступны), но у меня та же проблема.

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

user291701
источник
2
концептуально все кажется правильным. Вы уверены, что используете правильный хеш (подпись, как вы ее называете) фиксации? попробуйте 'git show <hash>', чтобы проверить.
0xc0de
Привет, да, положительно - обе мои ветки размещены на github, и я могу использовать их для поиска страниц фиксации таким образом. Насколько я понимаю, состояние моей машины локально таково, что git не может найти хэш от 'zebra' в контексте 'master'. Надо ли мне как-то сказать ему, что «зебра» тоже существует локально?
user291701
ох, и выполнение 'git show xyz' дает ту же ошибку «фатальный: плохой объект». (и я заменяю xyz правильным хешем).
user291701
И чтобы уточнить, я могу использовать свой хэш xyz, чтобы без проблем посмотреть на фиксацию на github, например: " github.com/me/test/commit/xyz ".
user291701

Ответы:

195

Поскольку «зебра» - это удаленная ветка, я подумал, что у меня нет ее данных локально.

Вы правы, что у вас нет нужных данных, но вы пытались исправить это неверным способом. Чтобы собирать данные локально из удаленного источника, вам необходимо использовать 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
Питер Лундгрен
источник
1
Архивная
1
Пробовал этот подход, чтобы выбрать исправление восходящего потока на Github, и оказалось, что проверенный хеш отличается от хеша на Github. Поэтому мне пришлось проверить, получить хеш и выбрать его.
DustWolf
1
На самом деле здесь отсутствует возможность передать удаленный в вишневом выборе, например: git cherry-pick <remote> <hash>
Джаред
хорошо работал после получения удаленной ветки. Спасибо :)
Adeel
да, работал и после загрузки для меня. Подробнее о git cherry-pick можно прочитать
Satheesh M,
12

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

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

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 - хеш фиксации, который вы хотите.

Сезар Аугусто
источник
хм, когда я уже добавил репо без флага восходящего потока?
Gobliins
10

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

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

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

$ git fetch foo

Перечислите их коммиты (в нем должны быть перечислены все полученные коммиты foo)

$ git log foo/master

Выбери нужный коммит

$ git cherry-pick 97fedac
Мухаммад Солиман
источник
5

После слияния ветки разработки с мастером я обычно удаляю ветку разработки. Однако, если я хочу выбрать коммиты в ветке разработки, я должен использовать хеш фиксации слияния, чтобы избежать ошибки «плохой объект».

Юусо Отонен
источник
3

Сначала необходимо получить данные обеих веток на локальном диске.

Что происходит, так это то, что вы пытаетесь выбрать из ветки-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 удаления (-)

temyong
источник
1

Мне вернули эту ошибку после использования идентификатора фиксации из вкладки идентификатора фиксации запроса на вытягивание. Эта фиксация была впоследствии раздавлена ​​и объединена. В запросе на перенос на github найдите этот текст: «объединенный коммит xxxxxxx в ...» вместо того, чтобы пытаться использовать идентификаторы фиксации из вкладки коммитов.

Мэри
источник
1

Коммит должен присутствовать в вашем локальном каталоге, проверьте с помощью git log.

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

Кулдип Саксена
источник
0

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

  • проверить свою главную ветку
  • откройте вкладку «Журнал / История»
  • найдите фиксацию xyz и щелкните ее правой кнопкой мыши
  • нажмите "Объединить ..."

сделано :)

Giona
источник
Это неверно. Потому что теперь вы объединяете HEAD мастера в zebra вместо только что выбранных коммитов.
Chef Pharaoh
0

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

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

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

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

Затем в своем репо сделайте выборку снова. Будет получена новая ветка, включая этот коммит.

lulalala
источник
0

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

git checkout <branch With Commit To Cherry-Pick>

используйте журнал, чтобы найти хеш фиксации

git log

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

git checkout < branch I Want To Place My Cherry-Picked-Hash In>

Наконец, вызовите Cherry-Pick из git (note) -x, чтобы добавить ваше сообщение Cherry-Pick к оригиналу. «При записи фиксации добавьте строку с надписью« (вишня, выбранная из фиксации…) »в исходное сообщение фиксации, чтобы указать, из какой фиксации было выбрано это изменение».

git cherry-pick -x <your hash commit to add to the current branch>
RVscript
источник