С помощью интерактивного перебазирования (git -i rebase ...
) можно редактировать коммиты в любом месте в линии текущей ветви, таким образом, «переписывая историю».
Однако данный коммит может принадлежать линиям нескольких ветвей.
Например, предположим, что у меня есть репо с такой структурой ветвления:
A --- B --- C --- D --- F --- G branch_1*
\
`-- H --- I --- J branch_2
\
`-- K branch_3
Если активная ветвь равна branch_1
, и я использую rebase -i
для редактирования коммита B
, результирующий репо будет выглядеть так (по крайней мере, пока не произойдет G C):
,-- b --- c --- d --- f --- g branch_1*
/
A --- B --- C --- D --- F --- G
\
`-- H --- I --- J branch_2
\
`-- K branch_3
Обратите внимание, что исходный B
по-прежнему находится в линиях branch_2
и branch_1
. Повторение процесса для каждой из этих веток, как бы это ни было утомительно, приведет к множественным избыточным фиксациям, и первоначальная структура ветки будет потеряна:
,-- b --- c --- d --- f --- g branch_1
/
A --- B --- C --- D --- F --- G
| \
| `-- H --- I --- J
| \
| `-- K
|\
| `-- b' -- c' -- h --- i --- j branch_2*
\
`-- b'' - c'' - h' -- i' -- k branch_3*
Обратите внимание, что b
, b'
и b''
по существу эквивалентны коммитам. То же самое касается c
, c'
и c''
, h
и h'
, i
и i'
.
Есть ли на полпути удобный способ чего-то достичь например:
A --- b --- c --- d --- f --- g branch_1*
\
`-- h --- i --- j branch_2
\
`-- k branch_3
... где модификация коммита B
распространяется через все линий, к которым он принадлежит?
(я бы предпочитайте решение, которое также распространяет изменения на все последующие тайники.)