Учитывая, что D
не вносит никаких изменений, есть несколько способов сделать это.
Сработает ребаз (как предполагает Шверн).«Воспитание» также подойдет.
Поскольку rebase «более знаком», я думаю, что некоторые люди могут предпочесть такой подход.С другой стороны, в некоторых случаях сложность перебазирования может привести к ошибкам;по этой причине я предпочитаю повторное воспитание в тех случаях, когда ожидается, что эти два значения будут одинаковыми.
Предполагая, что показанная вами история является историей ветви master
(и ничего, начиная с D
и далее)достижимо из любой другой ветки), тогда rebase будет
git rebase --onto C D master
с заменой C
и D
на выражения, которые разрешают соответствующие коммиты (т. е. идентификатор коммита или что-то вроде master~3
дляC
в диаграмме истории, которую вы показали).
Обратите внимание, что я использовал имя ветви, а не идентификатор фиксации или другое выражение, чтобы идентифицировать F
.Таким образом, операция rebase автоматически переместит ветвь.
Если после D
есть слияния (даже если все они сворачиваются обратно в одну еще текущую ветвь), или если есть несколько ветвей, указывающих наистория, которую вы перемещаете, это наиболее очевидные случаи, когда вы могли бы вместо этого рассмотреть вопрос о родительских правах.
В этом случае вы бы использовали git filter-branch
.Есть несколько способов сделать это;см. git filter-branch
документы (https://git -scm.com / docs / git-filter-branch ) в разделе parent-filter
;Есть примеры, которые показывают, как сделать переопределение коммита.