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

По мере прохождения курсов по Git решил зафиксировать основные моменты, чтобы можно было обратиться и освежить знания (сразу извиняюсь за орфографию, пишу наскоро).

Собрал немного общих команд из одного курса и структурировал лекции из другого.

Чтобы поиграться с git и посмотреть как визуализируются ваши действия можно тут: https://git-school.github.io/visualizing-git/

Alias

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

Можно делать глобальные настройки элиасов или для отдельного репозитория. Глобальные настройки можно сделать с опцией --global

Добавление элиасов

git config alias.st status
git config --global alias.st status

Вызов будет равносилен
git st -> git status

Можно добавить список команд
git config alias.st "status --short --branch"

git config --global alias.cma "commit -all -m" комит все айлы с сообщением
git cma "Add some more text"

можно добавить элиас с параметрами
git config alias.qm "!git checkout $1; git merge @{-1}"

! - значит что это shell команда
$1 - первый параметр в команде (название бранчи)
@{-1} - указывает на предыдущее состояние HEAD перед переключением на новую ветку
git qm master

Красивый лог

git log --oneline
git log --pretty=oneline - лог в одну строку

git log -1 - лог последних изменений
git status --short - выводит статус в коротком виде - 2 столбца + столбец с именем файла

git log --pretty='%h | %d %s (%cr) [%an]'
лог в виде
%h - hash коммита
%d - референсы на этот комит
%s - первая строка сообщения комита
%cr - время
%an - имя автора

git log --pretty='%h | %d %s (%cr) [%an]' --graph -all - то же самое, только с графом

Также можно окрашивать вывод при помощи %Ccolor
git log --pretty='%Cred%h%Creset | %C(yellow)%d%Creset %s %Cgreen(%cr)%Creset %C(cyan)[%an]%Creset' --graph -all

и добавим как элиас
git config --global alias.lg "log --pretty='%Cred%h%Creset | %C(yellow)%d%Creset %s %Cgreen(%cr)%Creset %C(cyan)[%an]%Creset' --graph"

Diffs

git diff -s - обертывает длинные строки и переносит их на новую
git diff --word-diff - показывает только изменные чсти вместо полной замены строк
git diff --check - проверка на ненужные пробелы
git rebase HEAD~2 --whitespace=fix - ребейзимся и удаляем лишние пробелы
git diff --patience - группирует изменения делая их более понятными
git diff --histogram - группирует изменения делая их более понятными (только быстрее)
git diff (--staged) - подробный лог изменений в файлах (только для тех, которые в stage)

git diff head~2..head --stat - посмотреть изменения между разными комитами
git diff head~2:README.MD..head:README.MD - посмотреть изменения в файле между разными комитами

Просмотр комитов

git show head~2 - отображение инфы о комите

git show head --pretty='parent %Cred%h%Creset commit %Cred%h%Creset%C(yellow)%d%Creset %n%n%w(72,2,2)%s%n%n%w(72,0,0)%C(cyan)%an%Creset %Cgreen%ar%Creset' - то же самое только с цветами

добавим сразу в элиас
git config --global alias.so "show --pretty='parent %Cred%h%Creset commit %Cred%h%Creset%C(yellow)%d%Creset %n%n%w(72,2,2)%s%n%n%w(72,0,0)%C(cyan)%an%Creset %Cgreen%ar%Creset'"
git so head --no-patch - покажет только метадату комита

git cat-file -p head - показыает контент коммита (с хешами для директорий)
git cat-file -p 9а3322 - показыает контент рабочей директории (с хешами для файлов)
git cat-file -p d323 - показыает контент файла (d323 - хеш файла)

Commits

Несколько правил для коммитов: они должны быть атомарными, консистентными, последовательными и документированными (A.C.I.D.)

Атомарность - семантически целостные изменения и имеют 1 логическое изменение
Консистентные - нет ошибок компиляции и сломанных тестов
Последовательные - отображают логический процесс разработки
Документированные - общий комментарий и описание комита

Отменить изменения из staged области можно через git reset HEAD

добавим это в элиас
git config --global alias.unstage "reset HEAD"

Добавить к комиту часть файла (hunk)
git add -p file --patch
y - yes - добавить в стейдж этот ханк
n - нет
j - up
k - down (перемещение)
s - разделить на несколько ханков
e - редактировать ханк
d - отменить изменения
q - выйти

Интерактивное добавление в stage

git add -i
где нужно выбрать первую команду (что делать), второй командой выбрать файл

git stash save --keep-index --include-untracked "MESSAGE" - добавить в стеш только файлы не находящиеся в стейдж части.
Это удобно если вы хотите проверить консистентность вашего комита без тех файлов, которые не будут в него включены. Если все ок - делает комиит и возвращаете файлы из стеша
git stash pop

git stash list - список всех стешей
git stash show - подробная инфа по стешу
git stash pop - применение самого последнего стеша на текущее состояние

Проверка сообщения комита с помощью хуков
Качаем по ссылке http://git.io/validate-commit-msg и копируем в .git/hooks/commit-msg
Теперь при комите будет проводиться проверка (хотя бы на длину).

Для того чтобы держать ваше историю комитов чистой и атомарной (что сложно при разработке), можно изменять историю перед тем, как она станет публичной (т е после пуша в репозиторий). Это удобно делать с помощью интереактивного rebase

git rebase -i HEAD~4

При этом можно делать squash (объединение комитов), reward(редактирование сообщения коммита) и edit(изменение контента комита).

Про squash можно почтитать тут.

После того как мы поизменяли все, нужно продолжить git rebase --continue
После этого ваша история станет чище.

Часть 2

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

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