в кожного свої звички роботи з git, — чув, є люди, котрі використовують графічні інструменти на кшталт втулків для vscode чи навіть окремі застосунки? — я використовую виключно командний рядок і декілька зручненьких аліясів (скорочень) для довгих команд. ось дещо з того, що накопичилося в глобальному конфігу (~/.gitconfig).

git alias

дозволяє мені швидко пригадати, які скорочення я собі налаштував:

~> git config --global alias.alias '!git config --global --get-regex alias. | sed "s/alias.\([^ ]*\)\s\(.*\)/\1\t\2/"'

використання:

~> git alias
stat    !git status; echo; git show --oneline --stat=,,10; git log --oneline -n5 HEAD^
tree    !tree --gitignore 
du      !du -h -c -d1
alias   !git config --global --get-regex alias. | sed "s/alias.\([^ ]*\)\s\(.*\)/\1\t\2/"
...

git stat

мені замало інформації стандантного git status, тому я зібрав собі трохи зручнішу версію, котра додатково показує журнал комітів з короткою статистикою змінених файлів останнього коміту:

~> git config --global alias.stat '!git status; echo; git show --oneline --stat=,,10 2>/dev/null; git log --oneline -n5 HEAD^ 2>/dev/null'

використання:

~/projects/python/tutorials/yart> git stat
На гілці part6/refactoring
Ваша гілка не відрізняється від "origin/part6/refactoring".

нічого комітити, робоче дерево чисте

c142943 (HEAD -> part6/refactoring, origin/part6/refactoring) fix: помилка в readme /ti
 readme.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
e9d6328 mod: поновлення readme /ti
8c5847b mod: рефакторинг engine.py, виправлення помилок /ti
1e48ed7 mod: рефакторинг procgen.py /ti
07687de mod: рефакторинг entities.py /ti
33c6d51 mod: refactor main.py /ti

git logs

трохи зручніший для читання журнал комітів, без необхідності друкувати --oneline щоразу:

~> git config --global alias.logs '!git log --pretty=format:"%C(yellow)%h%Creset %s %Cgreen(%cr)%Creset <%an> %C(yellow)%d%Creset" --abbrev-commit "$@" '

використання (можна додавати інші опції git log, як от -n 5, --graph тощо):

~/ownCloud/Щоденник/drafts> git logs -n 5
fa05314 add: ілюстрації до нових дописів /ti (5 тижнів тому) <tivasyk>  (HEAD -> master, origin/master)
9aa5603 add: допис про аліяси git /ti (5 тижнів тому) <tivasyk>
260d4d1 add: чимало давно не закомічених змін /ti (5 тижнів тому) <tivasyk>
385e0cf mod: публікація поновленого vim cookbook /ti (2 місяці тому) <tivasyk>
a1a54e6 add: ілюстрація #3: палітра everforest /ti (2 місяці тому) <tivasyk>

git tree

дозволяє швидко охопити оком дерево тек проєкту; зручніший за просто tree, бо аліяси git завжди запускаються в кореневій теці репозиторію, а --gitignore враховує виключення (фінальний пробіл потрібен):

~> git config --global alias.tree '!tree --dirsfirst --gitignore '

використання (зрозуміло, що можна додавати інші опції tree):

~/ownCloud/Щоденник/drafts> git tree -L 1
.
├── components
│   ├── actions.py
        ...
│   └── tiles.py
├── main.py
├── readme.md
├── requirements.txt
├── resources
│   ├── buddy-graphical.png
│   └── dejavu10x10_gs_tc.png
└── screenshots
    ├── Screenshot_20240121_090900.png
        ...
    └── Screenshot_20240210_175818.png

git du

дозволяє швидко оцінити розмір репозиторію (рідко, але буває потрібно); знову ж таки — зручно, бо запускається в корені незалежно від поточної теки в дереві проєкту:

git config --global alias.du '!du -h -d1'

використання:

~/ownCloud/Щоденник/drafts> git du
24K     ./resources
2,4M    ./screenshots
5,4M    ./.git
88K     ./components
123M    ./venv
130M    .

видалення аліясу

інколи потрібно видалити скорочення; на прикладі du:

~> git config --global --unset alias.du

repo

один з найзручніших для мене «прискорювачів» роботи з git — інтерактивний перемикач між різними локальними репозиторіями, — неможливо зробити як аліяс git, тому довелося винести його як окрему функцію до ~/library.sh (але можна просто додати до .bashrc чи .bash_profile):

repo() {
    # рекурсивний пошук локальних репозиторіїв git, інтерактивний вибір одного за допомогою fzf і перехід до теки
    cd $(find ~ -not -path '*/\.*/*' -name .git -exec dirname {} + -prune 2>/dev/null | fzf --tac --height=~10 --header="Choose local Git repo" --query="$1")
}

пояснення:

використання:

~> repo projects
  /home/tivasyk/projects/vim/vim-accent
  /home/tivasyk/projects/cheatsheet
  /home/tivasyk/projects/bashtan
  /home/tivasyk/projects/navijkl
  /home/tivasyk/projects/arduino
> /home/tivasyk/projects
  Choose local Git repo
  10/16 ———————————————————————————————
> projects

далі буде?..