У вас здесь правильное общее представление (о том, как использовать фильтр-ветвь), но неправильный синтаксис. Чтобы получить git filter-branch
для копирования (и фильтрации) коммитов, доступных с обоих имен A
и B
, но не для копирования + фильтрации коммитов, доступных с master
, используйте синтаксис:
git filter-branch <options> -- ^master A B
То, что мы делаем здесь, с git rev-list
аргументами ^master A B
, говорит Git: Найти все коммиты, достижимые из A
или B
, исключая все коммиты, достижимые из master
. Таким образом, если цепочки коммитов идут:
...--o--o--o <-- master
\
o--o--o <-- A
\
o--o <-- B
, например, это выбирает фиксации в средней и нижней строке. Это было бы даже с ^master B
или master..B
, как в phd-ответе , но это лучше по двум причинам. Во-первых, он по-прежнему выбирает все коммиты из средней строки с помощью:
...--o--o--o <-- master
\
o--o--o <-- A
\
o--o <-- B
(хотя это, вероятно, не ваша структура). Во-вторых, после копирования (и фильтрации) указанных коммитов так, что вы получите:
o--o <-- [filtered copy of commit to which B points]
/
o--o--o [filtered copy of commit to which A points]
/
...--o--o--o <-- master
\
o--o--o <-- A
\
o--o <-- B
команда filter-branch переместит все то, что документация звонки положительные отзывы . Положительной ссылкой является та, которая не имеет отрицания перед ней: в этом случае A
и B
, но не master
, поскольку master
написано ^master
и, следовательно, является отрицательной ссылкой.
Следовательно, это не затронет master
(не то, что это все равно будет - его коммит не скопирован), но будет стереть имена A
и B
так, чтоони указывают на скопированные коммиты.
Обратите внимание, что если вы не хотите вносить изменения в моментальные снимки в двух (в этом примере) B
только коммитах, то вы должны написать умныйфильтр, который делает это. (Или использовать фильтр, который не вносит изменений в дерево, но при «переформатировании» я предполагаю, что вы хотите использовать --tree-filter
и что-то вроде clang-format
на снимках в каждом из различных A
коммитовВозможно, более разумно идти вперед и вносить одинаковые изменения форматирования в различные B
коммиты.)