Найдите базу слияния 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