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

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

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

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

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

person Albert    schedule 22.05.2011    source источник
comment
Не совсем то, что вам нужно, но есть способы смоделировать их стратегию: stackoverflow.com/questions/4911794/   -  person VonC    schedule 22.05.2011
comment
@VonC: я думаю, ты не понял, что я имел в виду. Я знаю, как это смоделировать. Проблема в том, что это не работает вместе с rebase.   -  person Albert    schedule 22.05.2011
comment
следовательно, это не совсем то, что вам нужно. Это должно было сообщить другим об их стратегии в целом.   -  person VonC    schedule 23.05.2011


Ответы (2)


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

person bdonlan    schedule 22.05.2011
comment
Просто любопытно: если бы существовала стратегия theirs, чем бы она отличалась? И если бы это не отличалось, то почему здесь было бы плохо использовать rebase? Но в любом случае, этот вопрос был не о том, как этого добиться, а о том, как использовать стратегию theirs с rebase. Как этого добиться, на который уже был дан ответ в другом отдельном вопросе здесь . - person Albert; 23.05.2011
comment
@Albert, rebase применяет каждый коммит в ветке как патч. Это линеаризует историю и повышает вероятность конфликтов слияния. Если в вашей истории нет родительского коммита, это означает, что у вас будет конфликт между новым файлом и новым файлом, и я подозреваю, что стратегия взятия их может закончиться просто полным удалением первого коммита в последовательности... - person bdonlan; 23.05.2011
comment
Стороны меняются местами при перебазировании, т.е. их стратегия на самом деле является нашей стратегией. т.е. первый коммит точно останется таким, какой он есть. Как и для всех остальных коммитов. - person Albert; 23.05.2011

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

o C (X)
|
o B

o A

к этому:

o C' (X)
|
o B'
|
o A

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

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

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

Также см.: этот ответ на Чем отличаются git grafts и replace? (Являются ли прививки устаревшими?).

person Community    schedule 11.04.2018