Как удалить конкретный старый коммит, не удаляя изменения в коде (т. Е. Изменить git story в основном)

У меня есть хранилище, оно только мое, так что нет проблем с тем, чтобы что-то сломать. Кроме того, есть только одна ветвь, я думаю, что это делает вещи проще. Допустим, у меня есть 7 коммитов:

A -> B -> C -> D -> E -> F -> G

И я хочу удалить коммиты C и D

A -> B -> E -> F -> G

Быть A первым коммитом, когда-либо сделанным, а G последним коммитом.

Как я могу это сделать? Не касаясь моего кода, просто история Git.

Единственное, что я знаю, что могу сделать - это сбросить настройки Головы, но это не сработает, так как я не хочу удалять E, F и G.

3 ответа

Как уже упоминали другие, интерактивная перебазировка должна помочь вам в этом.

Вот процедура.

  1. Откройте командную строку /git bash

  2. Вы хотите удалить C а также D так что иди на коммит до C т.е. B, Вы можете сделать git rebase -i HEAD~6 или же git rebase -i <B's commit hash>

  3. Окно редактора должно открыться (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}
  1. Перебазировка должна продолжиться и удалить коммиты C а также D, Убедитесь, что вы разрешаете любые конфликты слияний, которые могут возникнуть в процессе, а затем выполните git rebase --continue (только если были конфликты)

  2. Когда закончите, бегите 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, но с возможностью для вас отказаться от коммитов, которые вы не хотите.

Другие вопросы по тегам