Pimp My Git

Данный пост не претендует на статус руководства, а является лишь сборником usecases и workflow используемых автором при ежедневной работе с git, и будет пополняться и обновляться с течением времени.

.gitconfig

Любая работа с git начинается с настройки. Но не все разработчики задаются целью потратить больше времени и немного подкрутив git, сократить себе в дальнейшем время при разработке.
Так уж исторически сложилось, что я не являюсь сторонником использования какого-либо GUI, потому, что большинство времени провожу на удаленном сервере, и считаю, что git вполне позволяет реализовать все недостающие возможности стандартными средствами.
Чтож, приступим к прокачке, для начала улучшив стандартный и скучный git log добавив к нему графическое отображение состояния веток, и пропишем alias’ы для основных комманд git.
Данную конфигурацию желательно поместить в ~/.gitconfig, чтобы в дальнейшем использовать данные настройки в любом репозитории git:

.gitignoreview raw
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[color]
ui = auto
branch = never
[color "branch"]
current = yellow reverse
local = yellow
remote = green
[color "diff"]
meta = yellow bold
frag = magenta bold
old = red bold
new = green bold
[color "status"]
added = yellow
changed = green
untracked = cyan
[alias]
st = status
ci = commit
br = branch
co = checkout
df = diff --color
rs = reset
rb = rebase
sh = stash
shp = stash pop
lg = log --pretty=format:'%h %Cblue%cn %Creset%cr %Cgreen%s'
plg = log --graph --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(bold white)— %an%C(reset)%C(bold yellow)%d%C(reset)' --abbrev-commit --date=relative
lg2 = log --graph --all --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(bold white)— %an%C(reset)%C(bold yellow)%d%C(reset)' --abbrev-commit --date=relative
alg = log --graph --all --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(bold white)— %an%C(reset)' --abbrev-commit

Теперь мы можем просмотреть древовидную историю текущей ветки просто выполнив в терминале git plg, а полную историю репозитория выполнив git alg.
Так же git df покажет нам более привычный вид изменений, как например в github’е, а git lg покажет улучшенную историю коммитов.
И как я уже говорил, вы получаете это в каждом репозитории живущем на вашей машине.

.bashrc

Не думаю что файл .bashrc, является безизвестным среди аудитории читающей данную статью. Он выполняет команды при инициализации сессии терминала.
Добавим некоторые улучшения по работе с git в терминал, просто добавив следующие строки в ~/.bashrc:
Про то, что , мы знаем не понаслышке.
Поэтому добавим alias для этой комплексной операции, добавив следующие строки в ~/.bashrc:

.bashrc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# отображение в терминале текущей ветки, если мы находимся в репозитории git
PS1='\[\033[01;36m\]`git branch 2>/dev/null | grep "^* " | sed "s/^* //" | sed "s/%->%//"` \[\033[01;37m\][\w]\[\033[00m\] \[\033[01;32m\]$\[\033[00m\] '
# чтобы всегда быть "на острие изменений" и ежедневно обновлять состояние ветки изменениями из master'a
git_update_current_branch() {
br=`git branch | grep "*" | sed -e "s/* //"`
echo " ==== Stashing changes"
git stash
echo " ==== Switching to master"
git checkout master
echo " ==== Updating master"
git pull
echo " ==== Switching back to $br"
git checkout $br
echo " ==== Merging master to $br"
git merge master
echo " ==== Unstashing changes"
git stash pop
echo " ==== Done!"
}
# очищаем репозиторий от неиспользуемых веток
git_clear_branches() {
git checkout master
echo " ==== Switching to master"
git branch | grep -v master | xargs git branch -D
echo " ==== Delete all branches"
}
# алиасы
alias cbr='git_clear_branches'
alias mrg='git_update_current_branch'

Конечно в данном варианте присутствует припрятывание текущих изменений используя stash, и оно не всегда валидно работает, например если нет изменений то stash pop выкатит какие-ннибудь давно припрятанные изменения.
Но это исправляется узъятием ненужных строк.

Have fun. Git make your life better!