Рассказывает Тим Петтерсен
В 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 log
для сравнения:
Форматировать вывод можно как угодно, так что берите мой вариант за основу и фантазируйте 🙂
Кстати, вот другой удобный вариант — git lg.
Если у вас есть полезные алиасы, делитесь ими в комментариях!
Перевод статьи «Lesser known Git commands»