учитывая следующий журнал git, как мне добавить файл (который никогда не существовал ни в одном коммите) для коммита B, чтобы этот новый файл появлялся в каждом другом коммите, который A?
A --> B -----> D ------> F
\--> C --> E --/
В моих попытках с git rebase --onto мне не удалось по существу не дублировать каждую фиксацию, изменяющую содержимое, но я уверен, что не приближаюсь к этому, используя всю мощь git. Любая помощь?
Примечание: удаленный доступ можно принудительно удалить или даже удалить и снова нажать, это не проблема.
Большое спасибо
Конечный результат будет таким: дублирование всех коммитов.
Однако о том, как это сделать, вы можете использовать git rebase
с некоторыми вариантами:
# -i for --interactive
# -r for --rebase-merges
git rebase -i -r A
git
откроет для вас текстовый редактор, попросив вас описать, какие действия вы хотите выполнить при каждом коммите.
В этом файле:
B
pick
на edit
git
начнет применять скрипт, которому вы его проинструктировали, и остановится после достижения B
.
На этом этапе вы можете добавить дополнительный файл:
git add
нужный файл git commit --amend
чтобы добавить его в B
git rebase --continue
продолжить ребазингЭто должно переписать все коммиты после B
.
Вы можете проверить свою локальную историю и содержание ваших коммитов,
если вы довольны результатом, вы можете push --force
.
Миссия выполнена. Пожалуйста, отредактируйте свой ответ и добавьте --preserver-merges (устаревший, но тот, который я использовал) или, что еще лучше, --rebase-merges в команду rebase. Это сохранит слияния и не сгладит дерево!
Сделанный. Я перепутал свои варианты, исправил.
git filter-branch может помочь. Он может переписать сразу несколько коммитов. Из вашей заметки я понимаю, что вы знаете о потенциальных проблемах. совершить перезапись общей истории (разные хэши и т.д.)
NB. Не помешает создать резервную копию, прежде чем пытаться это сделать :)
git filter-branch \
--index-filter 'cp /path/to/new/file path/in/repo && git add path/in/repo/file' \
-- A..F
Это применяет фильтр ко всем коммитам, доступным из F
, но исключая любые коммиты, доступные из A
(другими словами: исключая A
и всех его предков).
Привет, спасибо за предложение. Просмотр ветки фильтра документов кажется потенциальным кошмаром и в любом случае приводит к появлению дополнительных нежелательных объектов в переписанном репо. В любом случае, вы вдохновили меня заглянуть на github.com/newren/git-filter-repo, как предлагает документ, и я попробую сегодня!
Привет, я только что попробовал, и я думаю, что это может быть решением, даже если, следуя вашим шагам, я получил своего рода разделенную историю. A является предком B и B', где B все еще является родителем D, а B' является новым родителем C. Есть идеи, почему? Кажется, редактирование B не повлияло на ветку C-E. Интересно F, первоначальный коммит с обратным слиянием, похоже, исчез.