Здесь я буду использовать некоторые довольно опасные операции, поэтому просто обратите внимание.
Этот ответ делает несколько предположений:
Ваш окончательный master
филиал должен выглядеть следующим образом: A - B - D - E
Ваш окончательный new-feature
филиал должен выглядеть следующим образом: A - B - C
Отсутствие of commit C
не повлияет на применение коммитов D
и E
поверх обязательства B
.
Если это не так, пожалуйста, обновите здесь.
Во-первых, на мастер ветка, мы создаем новую ветку в качестве резервной копии. Давайте просто назовите это «backup».
git branch backup
Это позволит нам легко восстановить основную ветвь, если в противном случае произойдет что-то не так. Конечно, мы могли бы использовать git reflog
, но это намного удобнее.
Далее на главной ветви, сделать:
git rebase -i HEAD~3
Это должно запустить текстовый редактор для git rebase
(интерактивного режима). Найдите строку для фиксации C
и удалите ее.
Теперь, ваш мастер филиал должен выглядеть следующим образом:
A - B - D' - E'
Dont беспокоиться обо мне писать A - B - D' - E'
вместо A - B - D - E
. D
и D'
по существу эквивалентны с точки зрения наборов изменений.То же самое для E
и E'
.
Мы добираемся туда. Я предполагаю, что фиксация C
на ветке new-feature
должна быть разветвлена с фиксации B
. Найти совершить SHA1 для фиксации B
, затем (опустить угловые скобки ниже):
git checkout -b new-feature <SHA1 of commit B>
Это создаст филиал под названием new-feature
, который начинается на совершение B
, и проверяет его для вас. Сейчас мы находимся на new-feature
ветви, и это выглядит следующим образом:
A - B
Последний шаг, чтобы выяснить совершить SHA1 коммиттерских C
. У нас есть это в ветке backup
. Используя git log backup
(или какой-либо другой метод), найдите фиксацию SHA1 фиксации C
на резервной ветке. После этого, на new-feature
ветви, сделайте следующее:
git cherry-pick <SHA1 of commit C>
Конечно, пожалуйста, опустить угловые скобки.
Теперь new-feature
филиал должен выглядеть следующим образом:
A - B - C'
Большое спасибо! Ища подобное объяснение. – bbill
После перезагрузки 'git push' откажется нажать мастер из-за конфликтов с пультом. Я использовал 'git push origin + master', чтобы получить его, но я не уверен, что он правильный выбор. – Guss