Удалить коммиты из перебазированной ветки git после того, как были сделаны другие коммиты

У меня есть проект с двумя ветвями, которые называются master и feature/x. В feature/x я работаю над новыми функциями, которые будут объединены в master.

Из-за ошибки в feature/x было выполнено и отправлено действие перебазирования на основе мастера. Кроме того, были сделаны другие коммиты, которые были отправлены на feature/x.

Итак, у меня есть две ветки, которые содержат «одинаковые коммиты», отмеченные разными хэшами.

A -- B -- C -- D [master]
 \
  E -- F -- G -- H -- I [feature/x]

где C и D на master — это соответственно те же коммиты (перебазированные), что и F и G на feature/x.

Я хочу удалить F и G из feature/x, сохранив H и I. Как мне это сделать?

Я думаю вернуться к коммиту

git revert F G

из feature/x, но эти бесполезные (дубликаты) коммиты останутся в истории. Я хотел бы знать, есть ли лучший способ сделать это?


person bato    schedule 15.12.2014    source источник
comment
Вы не должны маркировать свои ветви с левой стороны, как вы сделали здесь; см. верхнюю часть этого моего ответа .   -  person jub0bs    schedule 15.12.2014
comment
@Jubobs готово, спасибо   -  person bato    schedule 15.12.2014


Ответы (1)


Самый простой способ — интерактивно перебазировать: оформить feature/x и выполнить

git rebase -i E

затем просто удалите строки для F, G из сценария перебазирования, который вам будет предложено отредактировать. Это сделает ваши ветки похожими на

master   -> A -- B -- C -- D
                  \
feaure/x ->        E -- H' -- I'
                    \
(orphaned)           F -- G -- H -- I

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

git rebase --onto E G feature/x

но интерактивный метод гораздо легче запомнить (мне пришлось посмотреть порядок аргументов в интерактивной справке).


Обратите внимание, что старые коммиты все еще существуют и могут быть восстановлены, но в конечном итоге будут удалены сборщиком мусора, если на них ничего не ссылается.

person Useless    schedule 15.12.2014
comment
@bato, только если feature/x был отправлен в удаленный репозиторий. - person Sascha Wolf; 15.12.2014
comment
@Zeeker да, это было :( - person bato; 15.12.2014
comment
В этом случае помните, что это касается и всех, кто вытащил из удаленного репозитория. - person Useless; 15.12.2014
comment
@ Бесполезно, да, я знаю. К счастью, над ним работает только другой человек. - person bato; 15.12.2014