Git Выборочное слияние - PullRequest
1 голос
/ 25 апреля 2019

У меня есть основная ветвь 'A' и ветвь функций 'B'.

Теперь файл с именем «X» эволюционировал с некоторыми изменениями в ветвях «A» и «B».

Как мне создать третью ветвь «C» (от мастера «A»), где я могу получить файл «X», содержащий как изменения из ветви «A», так и ветви «B». А также мне не нужны другие изменения коммитов от 'B'. Мне нужно только изменить файл «X» с «B».

Что я пробовал?

  • git cherrypick - Это не сработало, поскольку файл 'X' в ветви 'B' имеет сотни коммитов, связанных с ним. Это довольно сложно для вишневого выбора, и иногда это может привести к изменениям, связанным с другими файлами.

  • git checkout C && git checkout 'branch B' - path_of_X Я создал ветку 'C' из главной ветви 'A' и попытался извлечь файл 'X' из ветви 'B ». Теперь все мои изменения файла «X» из «A» исчезли. Кроме того, история Git для файла 'X' теряется.

  • git checkout C && git merge B --no-commit --no-ff Я создал ветвь 'C' из главной ветки 'A' и полностью слил ветку 'B' Опции --no-commit и -no-ff. Это принесло все изменения от «B». Теперь я попытался отменить все изменения в «C» от ​​«B», кроме изменений файла «X». Похоже, что нет способа сделать git discard, кроме файла / папки.

Как решить эту проблему? Любая помощь приветствуется. Заранее спасибо.

1 Ответ

2 голосов
/ 25 апреля 2019

Найдите базу слияния C и B.

base=$(git merge-base C B)

Создайте временную ветвь из $base.

git checkout -b temp $base

Сквош слияния B до temp.

git merge B --squash
git commit

Вишневое ядро ​​сдавленного коммита на C с -n.

git checkout C
git cherry-pick temp -n
# commit X only
git commit -m 'blah blah' -- path_to_X
# discard the rest introduced changes
git reset --hard
# if you want to add more changes, modify other files and use "git commit --amend" later

Удалите временную ветвь.

git branch -D temp
...