Как выбрать выбранный набор коммитов?

Я хочу выбрать конкретный набор коммитов, которые будут выбраны вишней в новую ветку.

main-branch
* commit8
* commit7
* commit6
* commit5
* commit4
* commit3
* commit2
* commit1

Я просто хочу создать ветвь release с выбранными коммитами.

release-branch
* commit7
* commit6
* commit4
* commit2
* commit1

Можно ли связать тег для необходимых коммитов и написать сценарий для зависания вишни с определенным тегом?

Всего 1 ответ


tl; dr: возможно, лучше использовать git rebase -i


Я не догадываюсь, что вижу, что вы ожидаете получить от пометки. Чтобы не говорить

git cherry-pick commit

для каждой фиксации вы должны сказать:

git tag my_tag commit

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

Это не значит, что ручной вишневый сбор - лучший способ. Точка вишни - это захват «того изменения, которое мне нужно»; если вам нужно обработать целую ветку, вероятно, проще использовать git rebase . Операция rebase часто неправильно понимается; он копирует коммиты, как черемуха. (Люди часто, похоже, думают, что они «заменяют» фиксации, удаляя оригиналы, это не совсем так. Это может изменить историю ref, но в этом и заключается.)

Так, например, если вы начнете с

A -- B -- C -- D -- E -- F -- G -- H <--(main-branch)

вы могли бы

git checkout main-branch
git checkout -b release-branch
git rebase -i master~6

(Я использовал master~6 потому что это выражение, которое ссылается на идентификатор объекта B ; B (hash), также будет работать. Я выбрал B потому что C - это первая фиксация, которую вы не хотите сохранять, поэтому перезапись начинается после B Если вы хотите удалить A , вы можете использовать выражение, которое разрешает родительский элемент A если A имеет родителя, или используйте --root если A не имеет родителя.)

Теперь git откроет редактор и покажет вам список «todo» с одной строкой для каждой фиксации в вашей ветке назад (но не включая) B Для коммитов, которые вы хотите удалить, измените первое слово на этой строке фиксации, начиная с pick чтобы drop (или просто удалить строку).

Когда вы выходите из редактора, операция rebase начнет «копирование» (т.е. совершение новых коммитов, которые применяют те же изменения на новой базе). На каждом шаге могут возникать конфликты (если изменение более позднего фиксации зависит от изменения ранее сделанного вами фиксации); вам будет предложено решить эту проблему и продолжить операцию переадресации.

Когда это будет сделано, вы будете иметь

A -- B -- C -- D -- E -- F -- G -- H <--(main-branch)
      
       D' -- F' -- G' <--(release-branch)

где D' применяет те же изменения, что и D , и т. д.

Это не лишено потенциальных недостатков (хотя недостатки одинаковы для rebase поскольку они были бы для cherry-pick ); это действительно зависит от того, что вы будете делать с ветвями отсюда. Если release-branch - это просто состояние терминала, которое вы освободите и забудете, это, наверное, хорошо. Если вам может понадобиться исправить выпуск, вы обнаружите, что слияние между release-branch и main-branch может быть затруднительным; поэтому вам, возможно, придется использовать cherry-pick или rebase чтобы поделиться исправлением между выпуском и основной линией развития.


Есть идеи?

10000