Как я могу удалить старый коммит Git из мастера и превратить его в собственную ветку?

В истории моей ветки C есть один коммит master, который, как мы решили, нуждается в доработке. Это не последний коммит. С тех пор было сделано более 10 коммитов. К счастью, ни один из последующих коммитов не затронул файлы, измененные C.

Я хочу удалить этот коммит из ветки master и одновременно создать новую ветку test-c из изменений в C. Таким образом, над ним можно будет проделать больше работы, а затем его можно будет объединить в master.

Итак, я хочу пойти от этого:

---A---B---C---D---E (master)

к этому

---A---B---D---E (master)
                \
                 '---C (test-c)

или даже просто к этому было бы нормально (могу потом слить)

---A---B---D---E (master)
        \
         '---C (test-c)

единственный релевантный ответ, который я смог найти, звучит так, как будто мне нужно либо написать скрипт, либо вручную перебазировать каждый последующий главный коммит (после C) на предыдущий. Я боюсь этого. Но этому ответу 9 лет, поэтому я надеюсь, что есть лучший способ.

Есть ли более простой способ сделать это в Visual Studio 2022 (или Tortoise Git, который я тоже использую)? Я посмотрел, что дал мне VS, когда я щелкнул правой кнопкой мыши по этому коммиту в истории веток master. Я вижу следующие варианты

Как я могу удалить старый коммит Git из мастера и превратить его в собственную ветку?

Что-то из этого то, что я хочу? Или я должен сделать все это перебазирование? В последнем случае я бы просто добавил реверсивную фиксацию в мастер, затем создал ветку с изменениями и пусть история выглядит загроможденной)

Ваш связанный ответ говорит о разных зависимых ветвях, ваш вопрос показывает только одну ветвь. Вот почему связанный ответ сложнее

knittl 17.03.2022 19:52
Стоит ли изучать 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
1
39
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Вы можете отменить фиксацию (оставив ее в истории), создать новую ветку, а затем выбрать исходную фиксацию. Переписывание опубликованной истории имеет много проблем, поэтому предлагаю отменить изменения коммита.

Требуется сбор вишни, потому что в противном случае отмененные изменения не будут объединены снова.

  1. git checkout master
  2. git revert bad-commit
  3. git checkout -b more-work
  4. git cherry-pick bad-commit
  5. Работайте над новой веткой и в конечном итоге слейте обратно

Если вам действительно нужно избавиться от исходного коммита (удалить его из истории, а не просто отменить его изменения), вы можете использовать (интерактивную) перебазировку. Интерактивный:

  1. git branch more-work bad-commit
  2. git rebase -i bad-commit^ master
  3. Измените строку с плохим коммитом с pick на drop (или удалите ее вообще`
  4. Сохраните и закройте файл

Не интерактивный:

  1. git branch more-work bad-commit
  2. git rebase --onto bad-commit^ bad-commit master

я бы сделал вот так

git rebase -i C~
# in the list of revisions, take the first line (C) and move it to be the last line. Save / exit

rebase должен запуститься, и теперь ветка должна быть A <- B <- D <- E <- C с master, указывающим на C (ну, на самом деле, C'. На самом деле это не оригинальная версия C).

Как обычно в этом случае, считайте, что вы переписывание истории ветки, и если эта ветка уже была разделена (другие люди уже работают с ней наверху), то попытка осуществить это вполне возможна, но болезненна, так что другие люди начнут использовать только что перебазированную ветка.

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