Как удалить конкретный старый коммит, не удаляя изменения в коде (т. Е. Изменить git story в основном)
У меня есть хранилище, оно только мое, так что нет проблем с тем, чтобы что-то сломать. Кроме того, есть только одна ветвь, я думаю, что это делает вещи проще. Допустим, у меня есть 7 коммитов:
A -> B -> C -> D -> E -> F -> G
И я хочу удалить коммиты C и D
A -> B -> E -> F -> G
Быть A первым коммитом, когда-либо сделанным, а G последним коммитом.
Как я могу это сделать? Не касаясь моего кода, просто история Git.
Единственное, что я знаю, что могу сделать - это сбросить настройки Головы, но это не сработает, так как я не хочу удалять E, F и G.
3 ответа
Как уже упоминали другие, интерактивная перебазировка должна помочь вам в этом.
Вот процедура.
Откройте командную строку /git bash
Вы хотите удалить
C
а такжеD
так что иди на коммит доC
т.е.B
, Вы можете сделатьgit rebase -i HEAD~6
или жеgit rebase -i <B's commit hash>
Окно редактора должно открыться (vim или что-то еще в зависимости от ваших настроек) и должно выглядеть так, как показано ниже
pick {A's commit message} pick {B's commit message} pick {C's commit message} pick {D's commit message} pick {E's commit message} pick {F's commit message} pick {G's commit message}
Удалить всю строку для коммитов C
а также D
а затем сохраните и закройте редактор. Так что ваш редактор теперь должен выглядеть так.
pick {A's commit message}
pick {B's commit message}
pick {E's commit message}
pick {F's commit message}
pick {G's commit message}
Перебазировка должна продолжиться и удалить коммиты
C
а такжеD
, Убедитесь, что вы разрешаете любые конфликты слияний, которые могут возникнуть в процессе, а затем выполнитеgit rebase --continue
(только если были конфликты)Когда закончите, бегите
git log
проверить, сработал ли ребаз
Вы можете сделать интерактивную перебазировку (см. Руководство git по переписыванию истории, в частности, раздел "Изменение порядка коммитов").
Например, ввод git rebase -i HEAD~5
откроет редактор файлов по умолчанию со списком 5 последних коммитов, от самых старых до новых:
pick f7f3f6d commit C
pick 310154e commit D
pick a5f4a0d commit E
pick aaaaaaa commit F
pick bbbbbbb commit G
Вы можете удалить строки для коммитов C и D. Как и в примере, приведенном выше по ссылке, когда вы сохраняете и выходите из редактора, Git перематывает вашу ветку к родителю этих коммитов (который является коммитом B), применяет коммиты E и затем F, а затем G, а затем останавливается. Вы эффективно удаляете коммиты C и D полностью.
Это может быть трудной задачей, поэтому сначала создайте новую ветку, чтобы поэкспериментировать с rebase.
Вы можете сделать интерактивный ребаз:
git checkout myBranch # with G being myBranch HEAD)
git rebase -i B
Это будет воспроизводить все коммиты после B
, но с возможностью для вас отказаться от коммитов, которые вы не хотите.