Как заменить фиксацию на другую в Git rebase?

Скажем, я работаю над функцией в ветке oldFeature. Я сделал commits A и B1 и отправил его для проверки кода. В B1 я изменил некоторые существующие файлы, но также добавил newfile.txt.

Тем временем я начал работать в ветке newFeature, разветвленной от oldFeature (HEAD == B1). Я добавил C, D, E.

Между тем, я получил результаты обзора кода и должен был изменить B1, изменив newfile.txt, а также изменив некоторые существующие файлы. После исправлений он стал B2.

Итак, чтобы проиллюстрировать это:

newFeature   oldFeature
A             A
B1            B2 [B1 with some fixes]
C
D
E

Теперь я нахожусь в newFeature, и я хочу rebase newFeature иметь B2 вместо B1. Когда я просто делаю rebase, у меня есть конфликт из-за того, что newfile.txt добавляется в обе части rebase.

Я хочу сохранить версию с oldFeature (B2).

Я не могу переместить B1 в HEAD, потому что от него зависят C, D, E.

Я знаю, что могу сделать следующее обходное решение:

Тогда у меня будет такая ситуация:

newFeature   oldFeature
A             A
B2            B2
BX
C
D
E

где BX больше или меньше B2\B1 для файлов, существовавших в A. Теперь я могу выполнить интерактивную перезагрузку и удалить BX.

Однако мой обход довольно запутан. Есть ли более простой способ сделать это? Говоря проще, я имею в виду, что у меня есть

newFeature   oldFeature
A             A
B2            B2
B2\B1
C
D
E

без конфликтов конфликтов, а затем я могу избавиться от этого B2\B1 commit или заменить их автоматически, чтобы получить

newFeature   oldFeature
A             A
B2            B2
C
D
E

Использование Git 1.8.0.

Ответ 1

Вы можете сделать reba interactive:

git checkout new_feature
git rebase --interactive old_feature

и drop B1: вы просто удаляете строку с помощью B1:

# If you remove a line here THAT COMMIT WILL BE LOST