Как сжать коммиты в Git, чтобы ваша история оставалась чистой
Когда вы работаете с Git, рекомендуется часто коммитить, чтобы вы всегда могли вернуться к состоянию кода, если вы испортили. Однако фиксация всех этих мини-изменений в основной ветке не всегда хорошая идея. Это делает историю запутанной и трудной для понимания.
Git предоставляет способ сжать кучу ваших коммитов с помощью команды rebase. После того, как вы локально внесли изменения в конкретный файл или для определенной функции, вы всегда можете использовать метод сквоша, чтобы объединить изменения вместе, прежде чем вы сделаете фиксацию в основной ветке. Это поможет другим лучше понять ваши изменения.
Предупреждение: даже если вы можете извлекать данные из внешних репозиториев и сквошировать вместе, это плохая идея. Это может вызвать конфликты и замешательство. Избегайте изменения истории, которая уже является общедоступной. Придерживайтесь только тех коммитов, которые являются локальными для вашей работы.
Давайте рассмотрим пример.
Допустим, у нас есть два файла a.ру и б.ру. Давайте сначала рассмотрим процесс создания файлов и внесения изменений:
$ mkdir myproject$ cd myproject /
$ git init
$ echo "print (" привет А ")"> а.ру
$ git add -A && git commit -m "Добавлен.ру "
$ echo "print (" привет, B ")"> b.ру
$ git add -A && git commit -m "Добавлено b.ру "
$ echo "print (" привет BB ")"> b.ру
$ git add -A && git commit -m "b.py Модификация 1 "
$ echo "print (" привет BBB ")"> b.ру
$ git add -A && git commit -m "b.py Модификация 2 "
Если мы проверим историю коммитов, то увидим следующее:
$ git log --oneline --graph --decorate* dfc0295 (HEAD -> master) b.py Модификация 2
* ce9e582 b.py Модификация 1
* 7a62538 Добавлен b.ру
* 952244a Добавлен.ру
После того, как мы закончили с нашей работой, мы решаем внести все изменения в b.py в одну фиксацию для ясности. Считаем, что есть 3 коммита на b.ру из ГОЛОВКИ. Выполняем следующую команду:
git rebase -i HEAD ~ 3Параметр -i указывает Git использовать интерактивный режим.
В текстовом редакторе Git должно появиться окно:
pick 7a62538 Добавлен b.рувыбрать ce9e582 b.py Модификация 1
выбрать dfc0295 b.py Модификация 2
# Rebase 952244a… dfc0295 на 952244a (3 команды)
#
# Команды:
# p, pick = использовать фиксацию
# r, reword = использовать фиксацию, но отредактировать сообщение фиксации
# e, edit = использовать фиксацию, но не вносить поправки
# s, squash = использовать фиксацию, но сливается с предыдущей фиксацией
# f, fixup = как "squash", но удалить сообщение журнала этой фиксации
# x, exec = run command (остальная часть строки) с использованием оболочки
#
# Эти строки можно переупорядочить; они выполняются сверху вниз.
#
# Если вы удалите здесь строчку, то COMMIT БУДЕТ УТЕРЯН.
#
# Однако, если вы удалите все, перебазирование будет прервано.
#
# Обратите внимание, что пустые коммиты закомментированы
~
Коммиты перечислены в хронологическом порядке вверху от самого раннего до самого последнего. Вы можете выбрать, какой коммит «выбрать», а какой - сквош. Для простоты мы выберем первую фиксацию и вложим в нее остальные. Итак, мы изменим текст следующим образом:
pick 7a62538 Добавлен b.русквош ce9e582 b.py Модификация 1
сквош dfc0295 b.py Модификация 2
# Rebase 952244a… dfc0295 на 952244a (3 команды)
#
# Команды:
# p, pick = использовать фиксацию
# r, reword = использовать фиксацию, но отредактировать сообщение фиксации
# e, edit = использовать фиксацию, но не вносить поправки
# s, squash = использовать фиксацию, но сливается с предыдущей фиксацией
# f, fixup = как "squash", но удалить сообщение журнала этой фиксации
# x, exec = run command (остальная часть строки) с использованием оболочки
#
# Эти строки можно переупорядочить; они выполняются сверху вниз.
#
# Если вы удалите здесь строчку, ЧТО COMMIT БУДЕТ УТЕРЯНЫ.
#
# Однако, если вы удалите все, перебазирование будет прервано.
#
# Обратите внимание, что пустые коммиты закомментированы
Как только вы сохраните и закроете текстовый файл, должно появиться другое текстовое окно, которое выглядит следующим образом:
# Это комбинация 3 коммитов.# Сообщение первого коммита:
Добавлен b.ру
# Это второе сообщение коммита:
б.py Модификация 1
# Это третье сообщение коммита:
б.py Модификация 2
# Пожалуйста, введите сообщение фиксации для ваших изменений. Линии начинаются
# с '#' будут проигнорированы, а пустое сообщение прервет фиксацию.
#
# Дата: Пт, 30 марта, 21:09:43 2018 -0700
#
# выполняется перебазирование; на 952244a
# В настоящее время вы редактируете фиксацию при перемещении ветки 'master' на '952244a'.
#
# Изменения, которые необходимо зафиксировать:
# Новый файл: b.ру
#
Сохраните и закройте этот файл. Вы должны увидеть что-то вроде этого:
$ git rebase -i HEAD ~ 3[отдельная ГОЛОВА 0798991] Добавлен б.ру
Дата: Пт 30 марта 21:09:43 2018 -0700
1 файл изменен, 1 вставка (+)
создать режим 100644 b.ру
Успешно перебазированы и обновлены ссылки / головы / мастер.
Если вы сейчас проверите историю коммитов:
$ git log --oneline --graph --decorate* 0798991 (HEAD -> master) Добавлен б.ру
* 952244a Добавлен.ру
Все коммиты для b.py были сжаты в одну фиксацию. Вы можете убедиться, посмотрев на букву b.py файл:
$ cat b.руprint ("привет BBB")
Содержит Модификацию 2.
Заключение
Перебазирование - мощная команда. Это может помочь вам сохранить вашу историю в чистоте. Но не используйте его для уже публичных коммитов, так как это может вызвать конфликты и путаницу. Используйте его только для своего собственного локального репозитория.
Дальнейшее изучение:
- https: // git-scm.com / docs / git-rebase
- https: // git-scm.com / book / en / v2 / Git-Branching-Rebasing
- https: // git-scm.com / book / en / v2 / Git-Tools-Rewriting-History