git - cherry-pick - HOWTO / ПОЧЕМУ

Проблема: вы хотите протестировать функцию, которую кто-то разработал, но она существует только в удаленной ветке, которая, к сожалению, устарела.

Источник

  1. Как вишня решает проблему?
  2. Почему я не могу использовать git am или git apply?

person 0x90    schedule 23.11.2012    source источник


Ответы (3)


Проблема: вы хотите протестировать функцию, которую кто-то разработал, но она существует только в удаленной ветке, которая, к сожалению, устарела.

Если вы выполните слияние или переустановку, вы получите кучу старых изменений, возможно, конфликтующих.

При выборе вишни вы берете один набор изменений и воспроизводите его как новую фиксацию в другой ветке.

Это полезно, если вы просто хотите, чтобы одна фиксация была перенесена в другую ветку без ее истории.

Полезно использовать параметр -x, чтобы сообщение фиксации содержало примечание, откуда оно было взято.

Почему я не могу использовать git am или git apply?

потому что git apply предназначен для применения патчей (файлов), а git am - для применения серии патчей. git cherry-pick применяет коммиты, то есть коммиты из вашего собственного репо, а не коммиты, которые вы импортируете из других репозиториев.

person alex    schedule 23.11.2012

Из git help cherry-pick:

git-cherry-pick - применить изменения, внесенные некоторыми существующими коммитами

[...]

Учитывая один или несколько существующих коммитов, примените изменения, вносимые каждым из них, записывая для каждого новый коммит. Это требует, чтобы ваше рабочее дерево было чистым (без изменений из фиксации HEAD).

Итак, когда вы cherry-pick коммит, git принимает изменения этого коммита (его diff) и пытается применить их к вашему текущему рабочему каталогу, создавая новый коммит, эквивалентный тому, который вы cherry-pick делаете.

Это способ повторить изменения другого коммита в другой строке истории.

Помимо внесения изменений, cherry-pick также сохраняет информацию об исходной фиксации, например об авторе и так далее.

Наконец, cherry-pick может получить группу коммитов для применения, и в этом случае он будет действовать как cherry-pick, добавляя их один за другим в хронологическом порядке (сначала старые).

person mgarciaisaia    schedule 23.11.2012

Проблема:
Вы хотите протестировать функцию, разработанную кем-то, но она существует только в удаленной ветке, которая, к сожалению, устарела.

Это решает проблему, потому что:

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

Последний момент важен, потому что первый недостаток выбора вишни заключается в том, что он вводит повторяющиеся коммиты. Но в вашем случае это не имеет значения.

Другой недостаток заключается в том, что выбранная вами фиксация может иметь функциональные зависимости на основе предыдущих коммитов (этой старой ветки).
Другими словами, его код работает только из-за других кодов других более старых коммитов (которые не собранные вишни).
Это бывает сложнее обнаружить.

person VonC    schedule 23.11.2012