Git aliases — пътеводител на мързеливия програмист

Статията е написана с предположение, че сте работили с git. Ако не сте, препоръчвам първо да минете през някой базов tutorial (например този на Роджър Дъдлър)

Годината е 2005-та, а Лари Маквой, бесен, че някой се е опитал да reverse-engineer-не неговата системата за контрол на версия на файлове — BitKeeper, спира безплатните лицензи на разработчиците на Линукс ядрото. След неуспешно търсене на заместител, Линус Торвалдс стига до заключението, че единственият вариант е да напише нова система — дистрибутирана, бърза и във всяко едно отношение — напълно обратна на най-популярната алтернатива CVS ( “ what would CVS never ever do” — Linus). Така се заражда git.

Дефиниция на акронима според оригиналния README файл

Git е изключително мощна система за контрол на версията на файлове, но както казва Волтер — “With great power comes great responsibility.” или за git — “… great complexity”.

git поддържа много функционалности — от изпращане на пачове по e-mail, до конфигуриране и стартиране на web-server от локално repository

Преди известно време реших, че за да разбера добре работния процес в git, най-удачният начин е да се науча да го използвам продуктивно през command line интерфейса. Мина известно време и както всеки мързелив програмист би направил — започнах да търся начини това да бъде по-удобно за мен (особено след поредния път, в който трябваше да търся как се ънстейджват файлове”). Няма проблем, нищо, с което добрият стар .bashrc да не може да се справи.

# .bashrcalias unstage="git reset -q HEAD --"

Дотук добре, но с добавянето на допълнителни alias-и (up, down, history) бързо започнаха да се появяват такива, които не е очевидно, че са свързани с git.

Това сега за git ли беше, за docker или за нещо друго 🤔

Този проблем може да бъде решен по множество начини — мога да променя alias-ите да ползват общ “prefix” (пр. gup, gdown, ghistory) или пък да направя функция, приемаща аргумент (пр. g $1)… но не може да няма и по-лесен начин…

Ето къде се появяват git aliases — псевдоними, изолирани от общия “namespace”. Примерните alias-и, които документацията показва са:

$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status

Супер! Дали не могат и да се конфигурират и с по-сложни команди?

Еквивалент на първият alias мога да добавя с:

git config --global alias.unstage 'reset -q HEAD --'

Което ще се отрази като промяна на ~/.gitconfig файла, където всички git alias-и се пазят:

[alias]
    unstage = reset -q HEAD --

Git alias-и се ползват като всички останали команди в git, т.е. бих извикал горепосочения с git unstage и това ще “ънстейджне” всички добавени файлове. Може да бъде ползван и с аргументи — git unstage README.md, което би премахнало от staging само посочения файл.


Ето и още няколко от любимите ми git alias-и, които често спестяват време покрай финализирането на комит преди да напусне локалното репо:

[alias]
    amend = commit --amend --no-edit
    amsg = commit --amend -m            
    uncommit = reset HEAD~
  • amendдобавя всички staged файлове към последния комит, запазвайки commit message-а.
  • amsg същото, но очаква съобщение като аргумент git amsg "wohoo" и променя commit message-a.
  • uncommit премахва последния комит, запазвайки файловете
[alias]
    history = "log --pretty=format:"%C(yellow)%h%Cred%d\\%Creset%s%Cblue\\ [%cn]" --decorate"

Това е конфигурацията, която ползвам, както на личната си машина, така и на служебната.


Git alias-ите са полезни от една страна за съкращаване на синтаксис (st -> status), но от друга — значително по-важна за мен — за добавяне на допълнителни опции към командата (st -> status -s) и по-логично наименование на “сложни” команди (unstage -> reset -q HEAD). Единственият недостатък е, че лесно се свиква с удобно създадените alias-и. За това пазете.gitconfig -a си на удобно място😉

Приятно гитене! 🚀🚀🚀

paysafe-bulgaria

Anything technical @ Paysafe Bulgaria

Viktor Penelski

Written by

paysafe-bulgaria

Anything technical @ Paysafe Bulgaria