Git: добавить файл в старую фиксацию, являющуюся родителем новой ветки, уже объединенной обратно?

учитывая следующий журнал git, как мне добавить файл (который никогда не существовал ни в одном коммите) для коммита B, чтобы этот новый файл появлялся в каждом другом коммите, который A?

A --> B -----> D ------> F
       \--> C --> E --/

В моих попытках с git rebase --onto мне не удалось по существу не дублировать каждую фиксацию, изменяющую содержимое, но я уверен, что не приближаюсь к этому, используя всю мощь git. Любая помощь?

Примечание: удаленный доступ можно принудительно удалить или даже удалить и снова нажать, это не проблема.

Большое спасибо

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
158
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Конечный результат будет таким: дублирование всех коммитов.

Однако о том, как это сделать, вы можете использовать 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.

Привет, я только что попробовал, и я думаю, что это может быть решением, даже если, следуя вашим шагам, я получил своего рода разделенную историю. A является предком B и B', где B все еще является родителем D, а B' является новым родителем C. Есть идеи, почему? Кажется, редактирование B не повлияло на ветку C-E. Интересно F, первоначальный коммит с обратным слиянием, похоже, исчез.

Gianks 14.12.2020 14:22

Миссия выполнена. Пожалуйста, отредактируйте свой ответ и добавьте --preserver-merges (устаревший, но тот, который я использовал) или, что еще лучше, --rebase-merges в команду rebase. Это сохранит слияния и не сгладит дерево!

Gianks 14.12.2020 15:23

Сделанный. Я перепутал свои варианты, исправил.

LeGEC 14.12.2020 15:33

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, как предлагает документ, и я попробую сегодня!

Gianks 14.12.2020 11:21

Другие вопросы по теме

По заданному имени ветки удаленного отслеживания Git, как узнать, какая локальная ветка ее отслеживает?
Как разрешить конфликты слияния без слияния целевой ветки с моей веткой в ​​базовом репозитории с 3 ветками?
Расширенное использование ветки git, перебазирование из вышестоящей ветки
Почему этот человек (см. ссылку на статью) использует checkout для создания функциональной ветки из ветки разработки, а не для получения?
Git: Почему так сложно получить имя родительской ветки?
Перебазируйте коммит, не объединяя его с базовым коммитом (просто переместите его рядом с конкретным коммитом в другой ветке)
Защищенный хук ветки Github отклоняется даже при разрешении принудительного нажатия
Как использовать git graph в коде vs?
Как реализовать пользовательское правило Rubocop для проверки соглашения об именах веток git?
Измените ветку по умолчанию для каждого настроенного Git Remote