Уничтожить всю цепочку коммитов из истории git? - PullRequest
0 голосов
/ 24 мая 2018

У меня очень странная проблема.После некоторого несчастного случая с попыткой миграции в Большое хранилище файлов Github и неудачной попытки миграции из него, у меня теперь есть очень запутанная топология git, которая выглядит следующим образом:

A  - B  - C - D - E - F 
            /
A' - B' - C'

Теперь Cточно так же, как C ', B точно так же, как B', и так далее, вплоть до первоначального коммита.Если я делаю «git log», я по существу вижу двойные коммиты для всего, прежде чем D. D само по себе является пустым слиянием.

Есть ли способ полностью удалить A ', B' и C ', чтобымоя история выглядит так?

A - B - C - E - F

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Учитывая, что 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;Есть примеры, которые показывают, как сделать переопределение коммита.

0 голосов
/ 24 мая 2018

Да.Вы можете перебазировать E - F на C.

git rebase --onto <new-base> <exclusive-start> <inclusive-end>

Поскольку начальная точка исключительная (она не будет перебазирована), мы начинаем с D и заканчиваем на F. (Этооблегчает перебазирование веток, которые находятся поверх ветвей).

git rebase --onto C D F

Вы получите это.

            E' - F'
           /
A  - B  - C - D - E - F 
            /
A' - B' - C'

Пока ничто не относится к F, A '- F со временем будет собирать мусор.

...