Як зробити вишню з віддаленої гілки?


135

У мене виникають проблеми з вишкою. На моїй місцевій машині я зараз перебуваю на своєму "майстерному" відділенні. Я хочу зайняти вишню в комітеті з іншої гілки, названої "зебра". Гілка «зебри» - віддалена гілка.

Отже, статус 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'

Тому зараз на моїй локальній машині я бачу, що файли в каталозі правильно відображають стан зебри. Я переходжу назад до майстра, спробую знову вибрати вишню (сподіваючись, що дані про фіксацію доступні зараз), але у мене виникає така ж проблема.

У мене принципове нерозуміння того, що тут відбувається, будь-яка допомога була б чудовою.


2
концептуально все здається правильно. Ви впевнені, що використовуєте правильний хеш (підпис, як це називаєте) комітету? спробуйте "git show <hash>", щоб перевірити.
0xc0de

Привіт, так позитивно - обидві мої гілки розташовані на Github, і я можу використовувати їх для пошуку сторінок фіксації таким чином. Якщо я розумію, стан моєї машини локально такий, що git не може знайти хеш із "зебри", перебуваючи в контексті "майстра". Чи потрібно мені якось сказати, що «зебра» теж існує локально?
користувач291701

о, і робити "git show xyz" дає ту саму помилку "фатально: поганий об'єкт". (і я замінюю xyz на правильний хеш).
користувач291701

І для уточнення, я можу використовувати свій хеш 'xyz' для того, щоб переглядати комісію на github без проблем, як-от: " github.com/me/test/commit/xyz ".
користувач291701

Відповіді:


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
Спробував цей підхід, щоб вибрати вишню виправлення на потоці на Github, і виявилося, що перевірений хеш відрізнявся від того, який був на Github. Тому мені довелося перевірити, отримати хеш і вишню.
DustWolf

1
Дійсно відсутня тут можливість пройти дистанційну передачу у вишневому вібраторі: git cherry-pick <remote> <hash>
Джаред

добре працював після отримання віддаленої гілки. Дякую :)
Адель

так, працював і після отримання для мене. Більше про git cherry-pick можна прочитати
Satheesh M

12

Так само як доповнення до ОП прийнято відповідь:

Якщо у вас є проблеми з

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

Де ххххххх - хеш фіксації, який ви хочете.


хм, коли я вже додав РЕПО без верхнього прапора?
Гоблінс

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, але локальна копія гілки-а ще не оновлюється (вам потрібно виконати потяг на git обидві гілки спочатку).

кроки:
- git checkout branch-a
- git pull origin branch-a
- git checkout branch-b
- git pull origin branch-b
- git cherry-pick <hash>

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


1

Цю помилку я повернув після використання ідентифікатора фіксації з вкладки запиту на виклик ідентифікатора. Це згодом було розбито і злито. У запиті на виклик github шукайте цей текст: "об'єднана фіксація xxxxxxx у ..." замість спроби використовувати ідентифікатори комісій на вкладці "коміти".


1

Комітет повинен бути присутнім у вашому місцевому регіоні, перевірити за допомогою git log.

Якщо комітету немає, спробуйте git fetchоновити локальний за допомогою останнього пульта.


0

Це також можна легко досягти за допомогою SourceTree:

  • оформити свою головну галузь
  • відкрийте вкладку "Журнал / Історія"
  • знайдіть фіксацію xyz і клацніть правою кнопкою миші на ній
  • натисніть "Об’єднати ..."

зробили :)


Це неправильно. Тому що тепер ви з’єднуєте ГОЛОВУ майстра в зебру замість просто вибраних доручень.
Фараон шеф-кухаря

0

Якщо ви зібралися, але це все-таки відбувається, може бути причиною наступне.

Може статися, що комітет, який ви намагаєтеся вибрати, вже не належить до жодної галузі. Це може статися під час перезавантаження.

У такому випадку на віддаленому репо:

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

Потім у вашому репо, заберіть знову. Нова гілка буде отримана, включаючи цю комісію.


0

Я вирішив це питання, перейшовши на гілку з зобов'язанням, яке хочу вишневим вибором.

git checkout <branch With Commit To Cherry-Pick>

використовувати журнал, щоб знайти хеш фіксації

git log

коли ви знайшли свій хеш-виріз та вставте на нотатку. якщо за допомогою команди просто прокрутіть вгору, щоб отримати хеш, тоді огляньте гілку, в яку потрібно розмістити комітку.

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

нарешті зателефонуйте вишневий пік з git (note) -x - це додати ваше повідомлення вишні до оригіналу. "Під час запису комісії додайте рядок із написом" (вишня, вибрана з фіксації…) "до оригінального повідомлення про фіксацію, щоб вказати, з якого складу цього вибору було вибрано вишневе."

git cherry-pick -x <your hash commit to add to the current branch>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.