Работа с коммитами

6. Работа с коммитами #

6.1. Редактирование последнего коммита #

Иногда требуется исправить последний коммит, например, чтобы изменить сообщение или добавить пропущенные файлы.

Изменение сообщения последнего коммита #

git commit --amend -m "Новое сообщение"

Добавление изменений в последний коммит #

  1. Внесите изменения в файлы и добавьте их в staging area:
    git add изменённый_файл
    
  2. Используйте команду:
    git commit --amend
    
    Это откроет текстовый редактор для изменения сообщения коммита.

Внимание #

  • Изменение коммита переписывает историю.
  • Не используйте --amend, если вы уже отправили коммит в удалённый репозиторий, чтобы избежать конфликтов.

6.2. Удаление и отмена коммитов #

Удаление последнего коммита (с сохранением изменений в файлах) #

Если вы хотите удалить последний коммит, оставив изменения в рабочей директории:

git reset --soft HEAD~1

Удаление последнего коммита (без сохранения изменений) #

Если изменения не нужны:

git reset --hard HEAD~1

Отмена изменений в рабочей директории #

Чтобы отменить изменения в файле:

git checkout -- имя_файла

Создание “отменяющего” коммита #

Если коммит уже отправлен в удалённый репозиторий, создайте новый коммит, который отменяет предыдущий:

git revert хэш_коммита

6.3. Работа с интерактивным git rebase #

Интерактивный rebase позволяет редактировать, объединять или удалять коммиты в истории.

Запуск интерактивного rebase #

  1. Укажите количество последних коммитов для редактирования:

    git rebase -i HEAD~количество_коммитов
    

    Пример:

    git rebase -i HEAD~3
    
  2. Откроется текстовый редактор с списком коммитов.

Основные действия в git rebase -i #

  • pick — оставить коммит как есть.
  • reword — изменить сообщение коммита.
  • edit — изменить сам коммит.
  • squash — объединить с предыдущим коммитом (сохранить сообщение обоих).
  • fixup — объединить с предыдущим коммитом (удалить сообщение текущего).
  • drop — удалить коммит.

Пример объединения коммитов (squash) #

  1. Установите pick для первого коммита и squash для последующих.
  2. После сохранения откроется редактор для объединённого сообщения.

Завершение rebase #

После редактирования примените изменения:

git rebase --continue

Отмена интерактивного rebase #

Если вы хотите отменить процесс:

git rebase --abort

6.4. Использование git cherry-pick для выбора отдельных коммитов #

Команда git cherry-pick позволяет перенести один или несколько коммитов из одной ветки в другую.

Пример: перенос одного коммита #

  1. Получите хэш коммита, который хотите перенести:
    git log
    
  2. Выполните команду:
    git cherry-pick хэш_коммита
    

Пример: перенос нескольких коммитов #

Для переноса нескольких коммитов укажите их хэши:

git cherry-pick хэш_1 хэш_2

Перенос диапазона коммитов #

Если нужно перенести последовательность коммитов:

git cherry-pick хэш_начала..хэш_конца

Разрешение конфликтов при cherry-pick #

Если возникают конфликты:

  1. Разрешите их вручную.
  2. Добавьте исправленные файлы в staging area:
    git add имя_файла
    
  3. Завершите перенос:
    git cherry-pick --continue
    

Отмена cherry-pick #

Если вы хотите отменить перенос:

git cherry-pick --abort

Итоги #

  • git commit --amend помогает исправить последний коммит.
  • git reset и git revert предоставляют гибкость в удалении или отмене коммитов.
  • Интерактивный git rebase позволяет переписывать историю для упрощения коммитов.
  • git cherry-pick — мощный инструмент для выборочного переноса изменений между ветками.