Как удалить конкретный старый коммит, не удаляя изменения в коде (то есть изменить git story в основном) - PullRequest
2 голосов
/ 03 апреля 2019

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

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

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

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

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

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

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

Ответы [ 3 ]

0 голосов
/ 03 апреля 2019

Вы можете сделать интерактивную перебазировку (см. Руководство 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.

0 голосов
/ 03 апреля 2019

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

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

  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, чтобы проверить, сработала ли перебазировка

0 голосов
/ 03 апреля 2019

Вы можете сделать интерактивный ребаз :

git checkout myBranch   # with G being myBranch HEAD)
git rebase -i B

, который будет воспроизводить все коммиты после B, но с возможностью уронитькоммиты вы не хотите.

...