Git: как использовать rebase с их стратегией

В принципе, я просто хочу (re) установить родительский (пусть скажем, commit A) конкретного commit (commit B), который является корневым фиксацией какой-либо ветки x. Здесь предлагается в одном из ответов, который я могу сделать с помощью трансплантатов. Я попробую это позже, может быть, это лучший способ.

Однако, прежде чем читать это, я подумал, что это должно быть возможно через rebase. Но поскольку родительский commit A немного отличается от B, и я просто хочу оставить целую ветвь x так, как она есть, только с установкой родителя на свой корневой фиксатор B, я думал, что могу использовать стратегия theirs, которая, похоже, не существует. Я наткнулся на это раньше (и думал, что это ошибка или моя установка Git), и всегда просто работаю, переключая ветки и используя стратегию ours. Однако при rebase в этом случае я вынужден использовать стратегию theirs.

Моя команда выглядит так:

git rebase -s theirs --onto A --root x x--rebased

Ответ 1

rebase не предназначен для того, что вы хотите сделать. Другой плакат был правильным; то, что вы хотите сделать, это настроить трансплантат, чтобы прикрепить B к A, а затем запустить git filter-branch, чтобы испечь его в фиксации. Пример этого точного варианта использования можно найти в git filter-branch manpage.

Ответ 2

Я не совсем уверен, что понимаю ваш вопрос, но если ваша цель - это:

  o C (X)
|
o B

o A
Код>

:

  o C '(X)
|
o B '
|
o A
Код>

затем git replace --graft B A должен делать то, что вы хотите.

N.B. B и B ' имеют одинаковые файлы, как и другие, но разные хеши-хэты, потому что их родительские коммиты отличаются. Аналогично C и C '.

Почему это нужно сделать с помощью git replace -graft, а не git rebase -s theirs, я не знаю. Предположительно это для истерического изюма.

Также см.: этот ответ до Как git трансплантаты и замена отличаются? (Сейчас ли перегибы теперь устарели?).