Продвинутые Git команды из курса (часть 3)

Продвинутые Git команды из курса (часть 3)

Изменение истории

Изменение сообщения комита (а также и изменений) с помощью команды amend
git commit --amend -C HEAD
-C - оставить прошлое сообщение
HEAD - оставить сообщение из HEAD комит

Удаление нескольких комитов, которые не нужны
git reset --hard HEAD~2

—hard полностью удаляет все изменения и приводит состояние к определенному комит
—soft оставляет изменения комит в staged области, так что их можно закомитать

git reset --mixed(можно опустить) - до состояния рабочей директории
git reset --soft - восстановление до staged состояния
git reset --hard - удаляет все изменения

Что если нам нужно добавить изменения к 1 комиту, хотя уже есть несколько после?
Можно использовать —autosquash

Сначала сделаем git commit --amend -m"fixup! сообщение комита"
git rebase -i --root --autoscquash

autoscquash найдет комит с fixup! и комит с сообщеием идущим после восклицательного знака и объединит эти 2 комита

reflog

Git создает рефлог для каждой бранчи и для описания head.

Посмотреть reflog:
git reflog master
git reflog
--------------2020-05-01---20.14.06

Посмотреть на что указывал head 2 позиции назад
git show HEAD@{2}

Восстановить изменения в ветке можно так
git reset --hard master@{1}

Создадим элиас для этого
git config --global alias.undo '!f() {git reset --hard $(git rev-parse --abbrev-ref HEAD)@${1-1}}; f'

создается bash функция, которая сразу и вызывается
rev-parse --abbrev-ref используется чтобы взять имя текущей ветки
${1-1} - параметр - на сколько изменений откатиться (если он не передан использовать дефолтный 1)

git undo 2 - откатиться на 2 комита

Git bisect

bisect позволяет вам найти плохой комит, который например поломал сборку

git bisect start - начинаем
Помечаем последний комит как bad и помечаем тот комит вкотором все было ок как good

git bisect bad HEAD
git bisect good HEAD~4

--------------2020-05-02---14.36.32

Git переходит на комит между ними и вы проверяете его
Если все ок, вы помечаете комит как good и git переходи опять на средний комит между good и bad

Таким образом при помощи бинарного поиска можно быстрее найти плохой комит
После этого выходим из bisect
git bisect reset

Можно кстати настроить git, чтобы он сам запускал команду по проверке билда например (если это возможно). Только она должна возвращать exit код 0, если все ок, или код ошибки при ошибке.

Короткая запись
git bisect start HEAD HEAD~4
git bisect run make - где make build script

Часть 1
Часть 2

Кстати, завел личный блог Sleepless Tech в Telegram про разработку и DIY, заходите!

И присоединяйтесь к каналам FrontEndDev и Web Stack в Telegram, чтобы не пропустить самое интересное из мира Web!