Как удалить определенный коммит в Git Bash и Vim

В этом уроке, я вам покажу как отменять коммиты из истории Git, используя мощный метод интерактивной перебазировки (interactive rebase)

Иногда в Git вы можете создать коммит, который впоследствии захотите удалить. Возможно, вы сделали коммит, который содержит изменения кода, которые вам больше не нужны, или вы случайно внесли что-то в коммит по ошибке. Вы можете попытаться исправить это вручную в вашей ветке и сделать еще один коммит без этих изменений, но таким образом вы останетесь с запутанной историей коммитов. Многие организации предпочитают поддерживать чистую историю Git и требуют от разработчиков оставлять только «ценные коммиты» и удалять любые другие, которые не являются необходимыми. Чистая история Git значительно облегчает работу разработчиков, потому что код становится гораздо легче читать и поддерживать. Однако, если вы не знаете, как удалить конкретный коммит в Git, и ваш босс требует от вас это сделать (как было в моем случае), данная задача может усложнить вам жизнь. Именно поэтому я решил поделиться своим опытом, чтобы вы не волновались так же, как и я, когда делал это в первый раз. Прежде чем я вам покажу как удалить конкретный коммит из истории Git с помощью интерактивного перебазирования и Vim, пройдёмся по быстрому напоминанию определений, на всякий случай.

Что такое интерактивный ребейз?

Интерактивное перебазирование в Git — это мощный инструмент, который предоставляет вам больше ручного контроля над процессом пересмотра истории в Git. Этот метод особенно полезен когда вам нужно удалить, добавить или изменить конкретный коммит, а также объединить несколько коммитов в один более крупный коммит.

Что такое история коммитов?

Это вероятно очевидно, но в основном история коммитов представляет собой список коммитов в древовидной структуре. Самый простой способ просмотреть историю коммитов — использовать команду git log в git bash:

git log --oneline

Эта команда предоставит вам список всех хешей коммитов, начиная с самого последнего. (Не паникуйте, если вы не знаете, как выйти из экрана, вы можете сделать это безопасным способом, набрав «q», что означает выход в Vim)

Изображение 1: История коммитов в git

Что такое VIM?

Vim — это текстовый редактор по умолчанию в Git Bash. В этом уроке предполагается, что вы используете Vim в качестве редактора Git Bash. Vim далек от интуитивного текстового редактора. Тем не менее он хорошо справляется со своей задачей и особенно полезен в операциях интерактивного перебазирования, то есть при удалении ненужных коммитов из истории Git.

Пока всё идёт гладко. На скриншоте выше мы видим последние 5 коммитов, которые мы сделали в Git. Теперь предположим, что мы хотим удалить четвертый коммит с хэшем 6ebf351. Для этого добавьте следующую строку в Git bash:

git rebase -i HEAD~4

HEAD~4 указывает на 4-й коммит с конца по сравнению с головой ветки. Замените число на номер коммита, который вы хотите удалить из истории.

Эта команда должна перевести вас в интерфейс Vim, и вы увидите список последних четырех коммитов.

Изображение 2: Интерактивный ребейз с помощью Vim

В Vim нажмите Esc, чтобы перейти в режим редактирования, затем выберите строку, которую хотите отредактировать, и нажмите dd, чтобы удалить строку. Наконец, сохраните и выйдите, на этот раз используя команду :wq.

После завершения перебазирования не забудьте отправить ваши изменения:

git push origin +branch

И, конечно же, проверьте вашу историю с помощью Git log, и последний четвертый коммит больше не должен быть виден.