git rebase «--preserve-merges --onto» не сохраняет слияний

Используя git v1.7.1 я пытаюсь сделать ребаз с обоими--preserve-merges а также--onto функции в то же время. Конечные результаты, кажется, без коммитов слияния, и поэтому кажутся линейными. Я предпочел бы сохранить коммиты слияния по той же причине, по которой люди часто используют--preserve-merges (легче увидеть группу коммитов, которая была логически отдельной функцией и разработана в отдельной ветке).

Моя основная ветка (пункт назначения для ребазинга) скучна:

A-B-C

В ветви функций, которую я хочу взять, есть ветвь подфункций, которая была объединена с ней. Подобно:

     X - Y
   /      \
V-W ------ Z

Где Z - коммит слияния, который является главой ветви компонента, из которой нужно взять, а X и Y были в ветви подфункции.

Я использую:git rebase --preserve-merges --onto C V Z

Я хотел бы закончить с:

         X - Y
        /     \
A-B-C-W ------ Z

Но вместо этого я получаю:

A-B-C-W-X-Y

Поскольку Z был бесконфликтным слиянием, окончательное состояние кода правильное, но история не так выразительна, как хотелось бы.

Есть ли способ получить то, что я хочу?

изменить по адресу @BombeЯ написал скрипт bash для построения моего примера. В моей системе (RHEL 6.2 с git 1.7.1) это демонстрирует мою проблему.

#! /bin/bash
# start a new empty repo
git init
# make some commits on the master branch
git checkout master
touch A.txt; git add A.txt; git commit -m "add A.txt"; git tag Atag
touch B.txt; git add B.txt; git commit -m "add B.txt"; git tag Btag
touch C.txt; git add C.txt; git commit -m "add C.txt"; git tag Ctag
# now build the feature branch
# start at Btag (more or less arbitrary; point is it's before C)
git checkout Btag
git checkout -b feature
touch V.txt; git add V.txt; git commit -m "add V.txt"; git tag Vtag
touch W.txt; git add W.txt; git commit -m "add W.txt"; git tag Wtag
# now a subfeature
git checkout -b subfeature
touch X.txt; git add X.txt; git commit -m "add X.txt"; git tag Xtag
touch Y.txt; git add Y.txt; git commit -m "add Y.txt"; git tag Ytag
# merge the subfeature into the feature
# preserves branch history with --no-ff
git checkout feature
git merge --no-ff subfeature
# the merge commit is our Z
git tag Ztag
# one more commit so that merge isn't the tip (for better illustration of Z missing later)
touch postZ.txt; git add postZ.txt; git commit -m "add postZ.txt"; git tag postZtag
# now do the rebase
git rebase --preserve-merges --onto Ctag Vtag
# optionally move the master branch forward to the top of feature branch
git checkout master
git merge feature

Перед ребазой я получаю:

        X-Y
       /   \
    V-W-----Z-postZ
   / 
A-B-C

После ребазирования я получаю:

        X-Y
       /   \
    V-W-----Z-postZ
   / 
A-B-C-W'-X'-Y'-postZ'

Обратите внимание на отсутствие Z 'между Y' и postZ '.

Ответы на вопрос(3)

Ваш ответ на вопрос