Продвинутые 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
После этого ваша история станет чище.
Кстати, завел личный блог Sleepless Tech в Telegram про разработку и DIY, заходите!
И присоединяйтесь к каналам FrontEndDev и Web Stack в Telegram, чтобы не пропустить самое интересное из мира Web!