Соедините вместе две независимые истории ветвей

У меня есть две независимые ветки в моем репозитории Git:

A---B---C branch "old"
X---Y---Z branch "master"

Я хочу создать следующую историю:

A---B---C---X---Y---Z

Я попробовал это с помощью следующей команды перебазирования (текущая ветвь — «мастер»):

git rebase --strategy=recursive --strategy-option=theirs old master

Это не удается с:

First, rewinding head to replay your work on top of it...
fatal: Could not parse object 'fb56e6e20ea4a605503732df1f5a0a407808dffa^'

fb56e6 — это первый коммит «старой» ветки.

В качестве альтернативы я использовал команду Cherry Pick (текущая ветка — «мастер»):

git rev-list --reverse old | git cherry-pick --stdin --keep-redundant-commits -X theirs

Это прекрасно работает, но все коммиты получают новый «коммиттер». Есть ли способ сказать Cherry Pick, что он не должен устанавливать коммиттер? Если нет, есть ли способ добиться того, чего я хочу, с помощью rebase?


person Lars Schneider    schedule 15.03.2016    source источник
comment
Что вы подразумеваете под независимым? Встречаются ли они где-нибудь в истории?   -  person choroba    schedule 15.03.2016
comment
Нет, они не встречаются (я думаю, это проблема, с которой спотыкается git rebase)   -  person Lars Schneider    schedule 15.03.2016
comment
Может быть, git-reparent?   -  person larsks    schedule 15.03.2016


Ответы (2)


Я решил это, используя git filter-branch:

FIX_COMMITTER='
    if test "$GIT_AUTHOR_NAME" != "$GIT_COMMITTER_EMAIL"; then
        GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"
        GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"
        export GIT_COMMITTER_EMAIL
        export GIT_COMMITTER_NAME
    fi
'
git filter-branch -f --env-filter "$FIX_COMMITTER" -- master

Источник идеи: https://gist.github.com/maciej/5875814

person Lars Schneider    schedule 15.03.2016

Мне нравится твой подход к выбору вишен. Просто запустите стандартные команды «установить информацию об авторе», прежде чем выполнять выборку, чтобы соответствовать данным «commiter», которые вы хотите сохранить.

git config --global user.name "John Doe"
git config --global user.email [email protected]

А затем верните себе информацию об авторе, когда закончите.

person G. Sylvie Davies    schedule 15.03.2016