Git

Как сжать коммиты Git

Как сжать коммиты Git

Как сжать коммиты в 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.

Заключение

Перебазирование - мощная команда. Это может помочь вам сохранить вашу историю в чистоте. Но не используйте его для уже публичных коммитов, так как это может вызвать конфликты и путаницу. Используйте его только для своего собственного локального репозитория.

Дальнейшее изучение:

Как изменить левую и правую кнопки мыши на ПК с Windows 10
Совершенно нормально, что все устройства компьютерной мыши эргономичны для правшей. Но есть мышиные устройства, специально разработанные для левшей ил...
Эмуляция щелчков мыши с помощью мыши без щелчка в Windows 10
Использование мыши или клавиатуры в неправильной позе или чрезмерное использование может привести к множеству проблем со здоровьем, включая растяжение...
Добавьте жесты мыши в Windows 10 с помощью этих бесплатных инструментов
В последние годы компьютеры и операционные системы сильно эволюционировали. Было время, когда пользователям приходилось использовать команды для навиг...