Маловідомі Git-команди



У Git є суворі зобов'язання щодо зворотної сумісності: багато просунуті можливості приховані за різноманітними опціями, а не застосовуються як поведінка за замовчуванням. На щастя, Git також підтримує і аліаси, так що ви можете створювати свої власні команди, які роблять всю характерну для Git магію. Під катом — добірка корисних (або як мінімум забавних) аліасів, визначених у моєму .gitconfig.

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

Кожному розробнику доводилося хоча б раз спілкуватися зі своїм тимлидом на тему примусового пуша (force pushing) в загальну гілку (не робіть цього). Ребейз (rebasing), внесення правок і squash — все це забавно до тих пір, поки ви не перезапишете частина загальної історії і не раскидаете повторювані коміти по всьому дерева. На щастя, Git не дозволить вам мимоволі переписати історію на сервері. Вам доведеться явним чином передати в git push опцію --force, щоб довести серйозність своїх намірів. Але примусовий пуш — це грубий підхід: ви затаптываете локальною версією вышерасположенную гілку, і всі зміни, які ви до того моменту не підтягнули (fetch), будуть стерті з історії.



Git-опція --force-with-lease діє набагато акуратніше: вона перевіряє, щоб ваша локальна копія ref'а була самої свіжої, перш ніж охопити її. Це означає, що ви як мінімум підтягнули всі зміни, які збираєтеся затоптати. Але щоб не писати кожен раз git push --force-with-lease, я зробив для цього рядка аліас: git please

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

Бувало так, що ви закоммитили і тут же зрозуміли, що забули проіндексувати (stage) файл? Більше не потрібно про це турбуватися! Аліас 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-команд. Вона реєструє всі зміни, що вносяться до відстежуваний файл у вашому робочому дереві, і приховує їх для подальшого використання, а вам показує чисте дерево, щоб ви могли спокійно працювати з іншою його частиною. Але якщо ви створили нові файли і ще не проіндексували їх, то за замовчуванням git stash їх не чіпатиме, тому у вас буде неохайне робоче дерево. Відповідно, за замовчуванням не ховається і вміст неотслеживаемых або ігнорованих файлів.

Я зробив кілька зручних аліасів для різних варіантів git stash, залежно від того, які біти вашого робочого дерева потрібно приховати:

git stsh # приховує тільки непроиндексированные зміни в файлах відслідковуються
git stash # приховує всі зміни в файлах відслідковуються 
git staash # приховує невідстежувані і записані файли
git staaash # приховує ігноровані, невідстежувані і записані файли

Якщо сумніваєтеся у виборі, то найдовший аліас (git staaash) завжди зможе відновити робочий дерево стану свіжого клону вашого репозиторію.

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

Я запускаю git status частіше будь-якої іншої Git-команди. Вбудована допомогу в Git за останні роки стала куди зручніше, що дуже добре для початківців, але для більш досвідчених користувачів інформація дуже багатослівна. Наприклад, git status пояснює мені у 12 рядках, що у мене пара індексованих, неіндексованих і неотслеживаемых змін:

$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: package.json
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes)
modified: package.json
Untracked files:
(use "git add <file>..." to include in what will be committed)
index.js

Все те ж саме git shorty каже мені трьома рядками:

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

Для стислості я зробив це у вигляді псевдонімів git st, не зміг зупинитися.

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

Якщо ви використовуєте звичайний робочий процес розгалуження без ребейза, то буде не кращим рішенням запускати стандартний git merge для злиття гілок з фічами з майстер-гілкою. Якщо не додати до цієї команди опції, то за замовчуванням стане використовуватися стратегія злиття --ff, при якій новий комміт злиття буде створено тільки в тому випадку, якщо у майстер-гілці немає нових змін. В іншому випадку майстер-гілка просто «перемотается» до місця останнього коміта у вашій гілці. Лише іноді, створюючи комміт злиття, при перегляді Git-історії буває непросто сказати код, який був розроблений в якій гілці.



git merc використовує стратегію --no-ff, при якій завжди створюється комміт злиття.



Між іншим, --no-ff завжди використовується за замовчуванням в ході злиття pull request'ів 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 lо) в останні роки розрісся настільки, що я більше не впевнений, ніби точно знаю, що він робить. Але виглядає красиво:



Для порівняння, ось стандартний git log:



Там доступні всі види зручних форматів, так що форкайте вищевказану команду і користуйтеся на здоров'я!

Для шанувальників GUI
Якщо ви шанувальник Git GUI і працюєте під Mac або Windows, то, можливо, ви використовуєте наш безкоштовний Git-клієнт Atlassian SourceTree. Якщо так, то застосуйте описані в цій статті аліаси, створивши нове кастомное дію — можна призначити комбінацію клавіш у налаштуваннях SourceTree:



Це дія запускається за допомогою менюActions -> Custom Actions) або клавіатурної комбінації:



Приємного аліасінга!
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.