Спасите день с помощью Git и удалите из истории коммитов

Вы сталкивались с ошибками или проблемами при работе с коммитами Git? Возможно, был сохранен неверный секрет или чувствительные данные. К счастью, вы можете обработать свои файлы с помощью Git, удалить их из коммита и исправить историю.

Если вы сделали несколько коммитов или клонировали репозиторий с уже существующей историей коммитов, вероятно, вы захотите просмотреть, какие все коммиты были сделаны. И в этом руководстве вы узнаете, как удалить запись из истории Git.

Читайте далее и спасайтесь с помощью Git!

Пререквизиты

Этот учебник включает пошаговые инструкции. Если вы хотите следовать за ними, убедитесь, что у вас есть следующее:

  • A local machine to test the Git commands – This tutorial uses Windows 10, but later versions will also work.
  • Git Bash – В этом учебнике используется Git Bash 2.36.

Удаление файла из коммита Git

Когда вы работаете с Git в команде, вы делаете сотни коммитов ежедневно. В результате существует высокая вероятность того, что вам может понадобиться отменить конкретный коммит, например, из-за неправильного файла или нескольких файлов. Это обычно вызвано изменением кода или конфигурации и становится проблемой.

Чтобы решить эту проблему, вам потребуется удалить файл или несколько файлов из коммита Git с помощью команд Git. Вы будете использовать один из популярных инструментов для удаления одного файла из коммита Git – инструмент Git Bash.

1. Откройте инструмент Git Bash на вашем компьютере с Windows.

2. Затем выполните следующую команду для создания папки репозитория и переключитесь на эту папку. Эти команды не выводятся на терминал. Но убедитесь, что замените ~/Desktop/Repository/repo1 на ваш путь и имя предпочтительной папки.

# Создает папку репозитория и подпапку repo1
mkdir -p ~/Desktop/Repository/repo1
# Изменяет рабочий каталог на repo1
cd ~/Desktop/Repository/repo1

3. Выполните следующие команды, чтобы инициализировать ваш репозиторий и создать два текстовых файла с именами test1.txt и test2.txt.

# Инициализирует локальный репозиторий (создает скрытую папку .git)
git init
# Создает два текстовых файла
touch test_file1.txt test_file2.txt
Initializes the local repository

4. Теперь выполните следующую команду, чтобы проверить статус коммита Git.

git status

После выполнения команды вы заметите, что коммиты не отслеживаются и еще не зафиксированы, как показано ниже.

Checking the status of Git commits on the Git terminal

5. Выполните команду git add ниже, чтобы добавить два текстовых файла, созданных на шаге три (test_file1.txt и test_file2.txt), в ваш локальный репозиторий.

Эта команда не выводит результат, но добавляет файлы без их отправки в удаленный репозиторий.

git add .

6. Затем выполните команду git commit ниже, чтобы Git отслеживал прогресс и изменения, сделанные в локальном репозитории.

git commit -m "Adding two new files test_file1.txt and text_file2.txt"
Committing Changes to Repository

7. После фиксации выполните нижеприведенную команду, чтобы удалить определенный файл (test_file2.txt) из коммита Git.

git rm --cached test_file2.txt
Removing a Specific File from the Git Commit

8. Наконец, перезапустите команду git status ниже, чтобы проверить состояние репозитория.

git status

Как видно ниже, файл был удален из области подготовки (коммит Git) и отображается как файл (test_file2.txt) в разделе Неотслеживаемые файлы.

Verifying the Removed Git Commit (test_file2.txt)

Удаление всех недавно зафиксированных файлов

Вы только что узнали, как удалить определенный файл из коммита Git. Но обычно вам придется удалить несколько файлов, и Git справится с этим с помощью команды git reset. Команда git reset – это сложный, но в то же время универсальный инструмент для отмены изменений в репозитории.

Чтобы увидеть, как работает git reset, вы зафиксируете несколько файлов, а затем сбросите изменения, чтобы удалить недавно зафиксированные файлы, хранящиеся в коммите Git:

1. Создайте два новых текстовых файла с именами test_file3.txt и test_file4.txt в папке ~/Desktop/Repository/repo1.

touch test_file3.txt test_file4.txt

2. Затем выполните команду git add ниже, которая не выводит результат, но добавляет новые текстовые файлы в ваш локальный репозиторий (~/Desktop/Repository/repo1).

git add .

3. Выполните команду git commit ниже, чтобы зафиксировать файлы, чтобы Git отслеживал прогресс и изменения, внесенные в репозиторий.

git commit -m "Adding two more files"
Committing Changes to the Repository

4. Теперь выполните нижеуказанную команду, чтобы проверить состояние вашего локального репозитория.

git status

Как видно ниже, вывод показывает сообщение “nothing to commit”, указывая на то, что все находится в порядке в репозитории.

Checking the Status of Git Commits

5. Затем выполните команду git reset ниже, чтобы отменить недавно сделанные коммиты на шаге три. Эта команда не предоставляет вывод, но удаляет файлы test_file3.txt и test_file4.txt.

git reset --soft HEAD~1

Также можно использовать git reset –soft HEAD^ для удаления всех файлов, которые были зафиксированы до этого.

6. Затем повторно выполните команду git status ниже, чтобы проверить состояние репозитория.

git status

Ниже вывод показывает файлы test_file3.txt и test_file4.txt, которые нужно зафиксировать. Этот вывод указывает на файлы, которые нужно удалить из коммита Git.

Verifying the Recent Commits were Removed

Удаление конкретных коммитов из истории Git

Удаление всех зафиксированных файлов отлично работает, если вы хотите начать с чистого листа. Но что если вам нужно удалить только определенный коммит? Команда git revert справится с этим, если вы знаете идентификатор коммита.

На последнем этапе раздела “Удаление всех недавно зафиксированных файлов” вы заметили, что коммиты не были зафиксированы, а были изменены. Теперь вы сделаете коммит, чтобы увидеть команду git revert в действии.

Выполните команду git commit ниже, чтобы зафиксировать последние изменения в вашем локальном репозитории.

git commit -m "Hello, I am committing those two files again"

После выполнения команды вы заметите, что оба текстовых файла снова зафиксированы, и идентификатор фиксации – 0315b85,, как показано ниже.

Committing the Changes in the Local Repository

Теперь выполните команду git revert ниже, чтобы отменить предыдущую фиксацию. Обязательно замените 0315b85 на идентификатор вашей фиксации.

git revert 0315b85

Ниже вы видите, что два файла, которые вы недавно зафиксировали, были удалены.

Reverting the Changes in the Local Repository

Удаление каталога из истории фиксаций Git

К этому моменту вы уже знаете, как удалить зафиксированный файл, но как насчет каталога? Удаление каталога из фиксации Git аналогично удалению файлов.

1. Выполните следующие команды, которые не выводят результат, но выполняют следующее:

  • Создайте папку с именем myfolder внутри вашего локального репозитория (~/Desktop/Repository/repo1).
  • Создайте файл с именем l.txt внутри папки ~/Desktop/Repository/repo1/myfolder.
mkdir myfolder && touch myfolder/l.txt

2. Затем выполните git-команды ниже, чтобы добавить новую папку (~/Desktop/Repository/repo1/myfolder) в ваш локальный репозиторий.

git add .
git commit -m "Adding folder"
Adding the new folder (folder) to the Local Repository

3. Выполните следующую команду git rm, чтобы удалить папку (myfolder), зафиксированную на шаге два.

git rm -r myfolder/
Removing the New Folder (folder) in Git Commit

4. Наконец, выполните команду git status, чтобы проверить статус репозитория и убедиться, что папка была удалена.

git status

Ниже вы видите, что весь каталог (myfolder) был успешно удален, вместе с файлом l.txt внутри.

Verifying the Folder (myfolder) Has Been Removed Successfully

Заключение

В этом уроке вы узнали, как работать с коммитами Git, такими как удаление определенного коммита, файла или нескольких файлов. Вы также коснулись удаления целой папки в локальном репозитории и фиксации изменений.

На данном этапе вы можете уверенно фиксировать изменения в вашем репозитории и удалять коммиты, которые считаете ненужными, не навредив всему.

Исходя из того, что вы узнали в этом уроке, какой метод, по вашему мнению, может быть отличным для работы с коммитами для вашей команды?

Source:
https://adamtheautomator.com/git-and-remove-from-commit/