Подборка удобных Git-алиасов от разработчика

Рассказывает Тим Петтерсен 


В Git большое внимание уделяется обратной совместимости: многие мощные функции спрятаны в виде опций. К счастью, Git поддерживает алиасы, поэтому можно создать свои команды для полной реализации Git-магии. Вот подборка самых полезных алиасов, определённых в моём .gitconfig.

git please

$ git config --global alias.please 'push --force-with-lease'

Каждый разработчик когда-нибудь общался с тимлидом на тему использования push --force в публичных ветках. rebase, amend и squash — это весело, но лишь до тех пор, пока вы не сломаете что-нибудь на сервере. К счастью, Git не позволит просто взять и переписать историю коммитов. Для этого команде push потребуется передать опцию --force. Но у неё есть побочный эффект — команда заменяет ветку вашей локальной версией, а все неизвлечённые изменения сотрутся из истории.

Опция –force-with-lease гораздо более приятна: она проверяет локальную копию перед перезаписью. Это значит, что изменения хотя бы будут извлечены. Поскольку команду git push --force-with-lease печатать достаточно долго, я создал вежливый алиас: git please.

git commend

$ git config --global alias.commend 'commit --amend --no-edit'

Когда-нибудь коммитили и вдруг осознавали, что забыли проиндексировать файл? Больше не о чем волноваться! git commend по-тихому прикрепляет все индексированные файлы к последнему коммиту, используя уже существующее сообщение.

$ git add Dockerfile
$ git commit -m ‘Update Bitbucket pipeline with new Docker image’
# (facepalm)
$ git add bitbucket-pipelines.yml
$ git commend

git it

$ git config --global alias.it \
'!git init && git commit -m “root” --allow-empty'

Первый коммит в репозитории нельзя переместить, как любой другой, поэтому стоит всегда создавать пустой коммит в качестве корневого. git it одновременно инициализирует репозиторий и создаёт пустой коммит. Надо использовать git it!

$ cd shiny-new-thing
$ git it
Initialized empty Git repository in /shiny-new-thing/.git/
[master (root-commit) efc9119] root

git staaash

$ git config --global alias.stsh 'stash --keep-index'
$ git config --global alias.staash 'stash --include-untracked'
$ git config --global alias.staaash 'stash --all'

git stash — это одна из самых полезных команд. Она берет изменения в отслеживаемых файлах и откладывает их для дальнейшего использования, освобождая поле для дальнейших действий. Однако неиндексированные, неотслеживаемые и игнорируемые файлы команда не трогает.

Я создал несколько удобных сокращений для различные вариаций команды:

git stsh # stash only unstaged changes to tracked files
git stash # stash any changes to tracked files
git staash # stash untracked and tracked files
git staaash # stash ignored, untracked, and tracked files

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

git shorty

$ git config --global alias.shorty 'status --short --branch'

Команду git status я точно использую чаще, чем любую другую. Команда очень полезна и понятна новичкам, но для более продвинутых пользователей её вывод слишком громоздок. Вот типичный пример:

$ git status
On branch master
Changes to be committed:
  (use “git reset HEAD …” to unstage)

    modified: package.json

Changes not staged for commit:
  (use “git add …” to update what will be committed)
  (use “git checkout -- …” to discard changes)

    modified: package.json

Untracked files:
  (use “git add …” to include in what will be committed)

    index.js

git shorty сообщает мне тоже самое так:

$ git shorty
## master
AM test
?? .gitignore

git merc

$ git config --global alias.merc 'merge --no-ff'

Если вы не используете перемещение, использование стандартной команды git merge для слияния веток с главной — не лучший вариант. По умолчанию эта команда использует опцию --ff, которая создаст merge-коммит только в случае отсутствия изменений в мастер-ветке, а иначе просто переместит её на последний коммит.

git merc использует --no-ff, что всегда создаёт merge-коммит. Кстати, именно такая опция используется по умолчанию в Bitbucket.

git grog

$ git config --global alias.grog 'log --graph --abbrev-commit --decorate --all 
--format=format:"%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(dim white) - %an%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n %C(white)%s%C(reset)"'

Мой алиас git grog (graphical log) развивался в течение нескольких лет, поэтому я и сам уже смутно понимаю, что он делает. Но выглядит он точно неплохо:

3

Вот стандартный вид git log для сравнения:

4

Форматировать вывод можно как угодно, так что берите мой вариант за основу и фантазируйте 🙂

Кстати, вот другой удобный вариант — git lg.


Если у вас есть полезные алиасы, делитесь ими в комментариях!

Перевод статьи «Lesser known Git commands»