Хорошо, вот мой путь:
Если бы я не зафиксировал манипулирование , я мог бы получить ответвление от первого коммита , а затем использовать git cherry-pick
с git log
в цикле, как предложил по Тим Вишер . Начиная с мастера, я думаю, это должно работать:
#!/bin/bash
# create the feature branch starting from feature.c's first commit
FIRSTCOMMIT=$(git log --pretty=format:"%H" feature.c | tail -n1)
git checkout -b feature $FIRSTCOMMIT
# find all commits concerning feature.c...
for i in $(git log feature..master --reverse --pretty=format:"%H" feature.c)
do
# ... cherry-pick them ...
git cherry-pick $i
# ... and copy ONE modified tag of it if existing
git describe --tags --exact-match $i && xargs taghelperscript
done
# now eliminate feature.c from master
git filter-branch --prune-empty --tag-name-filter "cat" --index-filter 'git rm --cached --ignore-unmatch feature.c' $FIRSTCOMMIT..master
С taghelperscript
что-то вроде git tag prefix.$1
(может быть, это можно сделать лучше?). Часть с тегами, вероятно, работает только для легких тегов, которые я использую. Также имейте в виду, что это не работает, если был переименован в какой-то момент, и если он уже существовал в начальном коммите, это может привести к двум отдельным историям, или (мое предположение) коммит в master
, который содержит удаление , которое может позже вызвать конфликт слияния или путаницу.
Проблема в том, что некоторые из моих коммитов изменяют другие файлы, в результате чего git cherry-pick
вызывает неразрешенное слияние или вводит эти другие файлы. Поэтому вместо этого я попробую немного магии. Позже. Оставайтесь с нами ...