Как сделать вишневый коммит, не испортив отношения запроса ветки? - PullRequest
1 голос
/ 26 апреля 2019

Cherry-picking commits создает новые коммиты с тем же содержимым.Если я выберу вишню из ветви dev в ветку test через ветку dev-to-test, то коммиты, которые я выбрал, будут включены в следующий запрос на извлечение из ветви dev в ветку test, хотя ихсодержимое уже добавлено в тестовую ветвь.

Например:

текущие коммиты, присутствующие в ветвях:

dev:  a-b-c-d-e-f
test: a-b-c

Затем я выбираю вишню и ускоренно пересылаю:

dev:         a-b-c-d-e-f
test:        a-b-c-g(content of e)-h(content of f)

Затем в dev добавляется новый коммит:

dev: a-b-c-d-e-f-i

Я хочу достичь трех вещей:

  1. следующий запрос на извлечение из dev для тестирования взабрать только коммиты d-i;
  2. история тестов, чтобы она выглядела как test: a-b-c-g-h-d-i;
  3. , чтобы иметь возможность отслеживать отношение теста к коммитам e-f через историю.

Как мне этого добиться?Или я должен реструктурировать рабочий процесс git, чтобы предотвратить такие вещи?

Вот реальный пример этой проблемы:

Вот настройка для запроса на получение, коммиты в красном поле ужебыл выбран для целевой ветви.

Screenshot from Azure DevOps pull request setup dialogue.

Вот итоговая история.Оранжевым цветом обозначены коммиты из вишневого пика.Красным цветом обозначены коммиты из запроса на извлечение.Красные коммиты не имеют связанных изменений и точно повторяют сообщения оранжевых коммитов.

Screenshot from Visual Studio git branch history.

Здесь приведены подробности выполненного запроса PR.В нем присутствуют эти два коммита, которых не должно быть, поскольку запрос на извлечение не применяет изменения, описанные в этих коммитах.

History from Azure DevOps completed pull request.

1 Ответ

1 голос
/ 26 апреля 2019

Текущая ситуация:

dev: a-b-c-d-e-f-i
test      \g-h

Обычно отправляет PR из dev для тестирования, а затем объединяет:

dev: a-b-c-d-e-f-i
test      \g-h----\j  # j = h+i

Вот как я бы описал тестовую ветвь после объединения

test: a-b-c-g-h-j
  • r(j) = r(h)+r(i) как отношение, поскольку j является потомком первого родителя h и второго родителя i.
  • c(j) = c(d)+c(i) в отношении содержимого файла, j представляет состояние содержимого файла, такое, что когда diff против h, будет равно d diff против c + i diff против f, en bref,

Теперь многие программы git GUI решают показывать вещи в виде линейного списка, обычно в обратном хронологическом порядке, например

dev: a-b-c-d-e-f-----i
test      \------g-h--\j
 | 
 V   # visually merged down to
     a-b-c-d-e-f.g.h.i-j

Thisпредставление является только визуально линейным, не означает, что эти коммиты связаны линейно.Итак, вы видите линейный список коммитов из многих веток, а не просто ветку test в вашем примере.С собственной историей у test все в порядке, есть только g-h, а не e-f.

Если вы действительно хотите, чтобы только одна пара g-h или e-f была обнаружена, ну, так как этоэто список коммитов всех веток в репо, из репо нужно удалить одну из пар.Другими словами, вам нужно переписать историю ветки dev или test.

Пару команд git можно выполнить такое переписывание, reset, rebase, filter-branch.

...