Подтвердить что ты не робот

Удаление всех коммитов в ветке после определенного фиксации

Мне сложно понять, как я могу использовать rebase/revert для выполнения этого.

Я работал над веткой master и после некоторого фиксации мое программное обеспечение перестало работать. Я не хотел потерять изменения, сделанные в то время, и я был вынужден вовремя достичь знамена, поэтому я вернул несколько коммитов с помощью git checkout и создал новую ветку под названием working и начал толкать все мои изменения там. Позже я понял, что эти изменения (сделанные на ветке master) не нужны. Теперь я хочу вернуться к моей главной ветке и удалить все коммиты после фиксации, которую я использовал для создания ветки working, а затем объединить ветвь working в ветку master.

Я создал изображение с помощью онлайн-редактора фотографий, чтобы попытаться объяснить, что я пытаюсь сделать. Надеюсь, это поможет:

screen shot of bitbucket

Я хочу сохранить все после 5cb967f. избавиться от всего между 5cb967f и a0c1de2 (не включая те)

4b9b3361

Ответ 1

У вас есть два варианта:

Переписать историю (деструктивный)

Вы можете использовать git-rebase, чтобы переписать историю, оммитируя эти коммиты. Вы можете запустить интерактивную перезагрузку. Из вашего описания я точно не знаю, что у вас есть в master и working, но я предполагаю, что вся история (желаемая и нежелательная) присутствует там.

  git checkout master
  git rebase -i a0c1de2

На этом этапе ваш $EDITOR выведет список коммитов из a0c1de2 в HEAD master. Вы можете удалить строки, соответствующие c460070..a3cb10e, чтобы удалить их из истории.

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

Возврат, сохранение истории (неразрушающий)

Если вы предпочитаете сохранять историю, вы можете вернуть последовательность коммитов:

git checkout master
git revert c460070..a3cb10e

Это создаст 7 новых коммитов, каждый из которых будет исправлять изменения этих нежелательных коммитов в порядке.

Ответ 2

Кое-что о графике истории вяло. Просматривая текстовую разметку, вы хотите просто

$ git branch -f master working

потому что не было какой-либо пост- working -базы, налагаемой на master, которую вы хотите сохранить.