Написать пост

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

Аватар Иван Бирюков

Обложка поста Подборка удобных 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) развивался в течение нескольких лет, поэтому я и сам уже смутно понимаю, что он делает. Но выглядит он точно неплохо:

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

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

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

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

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

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

Следите за новыми постами
Следите за новыми постами по любимым темам
12К открытий12К показов