Share (pull request) ТОЛЬКО НЕКОТОРЫЕ коммиты с восходящим репозиторием

Мы сталкиваемся с ситуацией, когда мы настраиваем webapp для нашей компании (GA) и вам необходимо отправить НЕКОТОРЫЕ изменения в репозиторий git вверх по потоковым запросам. Верхний адрес webapp - "AUS". Изменения будут в определенных файлах и известны до того, как работа будет выполнена. Вся работа (даже для AUS) должна быть зафиксирована в GA.

Как мы обходим это без дублирующих коммитов (от cherry-pick и rebase) и сохранить его в чистоте и легко следовать?

Я разработал "рецепт" для этого и хотел поделиться им.

Ответы

Ответ 1

Я описываю рецепт и показываю скриншоты состояния репозитория, как показано в SourceTree (так как он показывает все ветки сразу). Обратите внимание, что ветки - это "au", "ga" и "master" вместо GPT-99_description_AU, GPT-99_description_GA и GPT-99_description, используемые в рецепте.

(Вы можете спросить, почему есть дополнительная строка и период перед каждым блоком кода - единственный способ, которым я мог бы его форматировать сегодня!)

  • Создайте 3 ветки. Они должны отражать проблему, над которой нужно работать, и иметь один для AuScope, а другой для GA. Нам также нужен один, чтобы объединиться в

.

$ git checkout master # or whatever base branch we will be using
$ git branch GPT-99_description
$ git branch GPT-99_description_AU
$ git branch GPT-99_description_GA
  • Выполнять всю работу над ветвью GA

.

$ git checkout GPT-99_description_GA
  • Выполнять изменения, добавлять файлы и удалять файлы по мере необходимости
  • ИДЕНТИФИЦИРУЙТЕ ФАЙЛЫ, КОТОРЫЕ ДОЛЖНЫ ПОЙТИ В AUS, так как они должны быть совершены отдельно (иначе как мы отправим JUST THOSE в AUS?)
  • Зафиксируйте файлы AUS. Запустите сообщение фиксации с чем-то, что идентифицирует как файл AUS совершает

.

$ git add <files>
$ git commit -m "GPT-99 - AUS files - ..." 

Возможно, вместо использования использования тегов. Что-то посмотреть позже.

  • Зафиксируйте файлы GA. Нет необходимости в идентификационном сообщении.

.

$ git add <files>
$ git commit -m "GPT-99 - ..."

Просмотр SourceTree после добавления, удаления, редактирования

  • Переключиться на ветвь AuScope

.

Switch to the AuScope branch
  • Вишневый захват AuScope совершает (смотрите журнал)

.

$ git cherry-pick SHA#1
$ git cherry-pick SHA#2
...

После выбора вишни

  • Теперь, что произошло здесь, это то, что коммиты были скопированы и будут существовать на GA-ветвях AUS. Коммиты являются отдельными (у них разные SHA), но их содержание одно и то же - если оба будут воспроизведены, будет конфликт, так как оба будут пытаться добавить/удалить/отредактировать одно и то же. Мы можем использовать трюк git, как описано в https://git-scm.com/book/en/v2/Git-Branching-Rebasing#Rebase-When-You-Rebase, где скопированные коммиты будут иметь идентификатор патча, который идентифицирует коммит как быть тем же. Это позволяет нам переустанавливать и git разрешает разные коммиты быть только одним

.

$ git rebase --onto GPT-99_description GPT-99_description_AU GPT-99_description_GA

введите описание изображения здесь

  • Дубликаты фиксируются. Однако ветвь GA не имеет изменений AUS. Чтобы это произошло, мы сливаемся:

.

$ git checkout GPT-99_description_GA
$ git merge GPT-99_description_AU
  • Репозиторий теперь находится в состоянии, где ВСЕ изменения находятся на ветке GA, а изменения, которые должны быть отправлены в качестве запроса на перенос в AuScope, находятся в ветки AU.

После объединения - отдельная ветка, чтобы выполнить запрос на перенос на