zsh 下 git 別名(alias) 和 oh-my-zsh git 外掛的故事

ingood發表於2016-10-01

學習 git 的過程中,想給一些 git 命令設定一些別名,這樣也可以提高一下效率。

因為用的是 zsh ,就在 ~/.zshrc

alias gst=`git status`
alias gcm=`git commit -m `
alias gps=`git push`
alias glg=`git log --graph`

結果在執行 gcm 的時候,執行不正確。用 alias gcm 檢視該別名設定:

➜  ~ alias gcm
gcm=`git checkout master`

原來配置成了其他命令。
但是奇怪的是,在 .zshrc 檔案中並沒有找到相關配置。經過仔細閱讀,最終發現了下面這條語句:

# Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*)
# Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/
# Example format: plugins=(rails git textmate ruby lighthouse)
# Add wisely, as too many plugins slow down shell startup.
plugins=(git)

原來我的 zsh 安裝了 oh-my-zsh,不知道是我自己安裝還是預設自帶了一個 git 外掛,那我們按照註釋說明,到那個外掛下看一下吧。

cd ~/.oh-my-zsh/plugins/git
ls
README.md      git.plugin.zsh

可以看到一個 git.plugin.zsh 檔案,vi 開啟,看到一些 functions 和 N 多的 alias。
具體檔案內容我就懶得貼出來了,如果你有興趣,終端下執行一下 alias 就列出所有可用別名,比看那個 git.plugin.zsh 檔案更清楚明瞭 。
大致如下:

g=git
ga=`git add`
gaa=`git add --all`
gapa=`git add --patch`
gb=`git branch`
gba=`git branch -a`
gbd=`git branch -d`
gbda=`git branch --no-color --merged | command grep -vE "^(*|s*(master|develop|dev)s*$)" | command xargs -n 1 git branch -d`
gbl=`git blame -b -w`
gbnm=`git branch --no-merged`
gbr=`git branch --remote`
gbs=`git bisect`
gbsb=`git bisect bad`
gbsg=`git bisect good`
gbsr=`git bisect reset`
gbss=`git bisect start`
gc=`git commit -v`
`gc!`=`git commit -v --amend`
gca=`git commit -v -a`
`gca!`=`git commit -v -a --amend`
gcam=`git commit -a -m`
`gcan!`=`git commit -v -a --no-edit --amend`
`gcans!`=`git commit -v -a -s --no-edit --amend`
gcb=`git checkout -b`
gcd=`git checkout develop`
gcf=`git config --list`
gcl=`git clone --recursive`
gclean=`git clean -fd`
gcm=`git checkout master`
gcmsg=`git commit -m`
`gcn!`=`git commit -v --no-edit --amend`
gco=`git checkout`
gcount=`git shortlog -sn`
gcp=`git cherry-pick`
gcpa=`git cherry-pick --abort`
gcpc=`git cherry-pick --continue`
gcs=`git commit -S`
gd=`git diff`
gdca=`git diff --cached`
gdct=`git describe --tags `git rev-list --tags --max-count=1``
gdt=`git diff-tree --no-commit-id --name-only -r`
gdw=`git diff --word-diff`
gf=`git fetch`
gfa=`git fetch --all --prune`
gfo=`git fetch origin`
gg=`git gui citool`
gga=`git gui citool --amend`
ggpull=`git pull origin $(git_current_branch)`
ggpur=ggu
ggpush=`git push origin $(git_current_branch)`
ggsup=`git branch --set-upstream-to=origin/$(git_current_branch)`
ghh=`git help`
gignore=`git update-index --assume-unchanged`
gignored=`git ls-files -v | grep "^[[:lower:]]"`
git-svn-dcommit-push=`git svn dcommit && git push github master:svntrunk`
gk=`gitk --all --branches`
gke=`gitk --all $(git log -g --pretty=%h)`
gl=`git pull`
glg=`git log --stat`
glgg=`git log --graph`
glgga=`git log --graph --decorate --all`
glgm=`git log --graph --max-count=10`
glgp=`git log --stat -p`
glo=`git log --oneline --decorate`
globurl=`noglob urlglobber `
glog=`git log --oneline --decorate --graph`
gloga=`git log --oneline --decorate --graph --all`
glol=`git log --graph --pretty=```%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset``` --abbrev-commit`
glola=`git log --graph --pretty=```%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset``` --abbrev-commit --all`
glp=_git_log_prettily
glum=`git pull upstream master`
gm=`git merge`
gmom=`git merge origin/master`
gmt=`git mergetool --no-prompt`
gmtvim=`git mergetool --no-prompt --tool=vimdiff`
gmum=`git merge upstream/master`
gp=`git push`
gpd=`git push --dry-run`
gpoat=`git push origin --all && git push origin --tags`
gpristine=`git reset --hard && git clean -dfx`
gpsup=`git push --set-upstream origin $(git_current_branch)`
gpu=`git push upstream`
gpv=`git push -v`
gr=`git remote`
gra=`git remote add`
grb=`git rebase`
grba=`git rebase --abort`
grbc=`git rebase --continue`
grbi=`git rebase -i`
grbm=`git rebase master`
grbs=`git rebase --skip`
grep=`grep  --color=auto --exclude-dir={.bzr,CVS,.git,.hg,.svn}`
grh=`git reset HEAD`
grhh=`git reset HEAD --hard`
grmv=`git remote rename`
grrm=`git remote remove`
grset=`git remote set-url`
grt=`cd $(git rev-parse --show-toplevel || echo ".")`
gru=`git reset --`
grup=`git remote update`
grv=`git remote -v`
gsb=`git status -sb`
gsd=`git svn dcommit`
gsi=`git submodule init`
gsps=`git show --pretty=short --show-signature`
gsr=`git svn rebase`
gss=`git status -s`
gst=`git status`
gsta=`git stash save`
gstaa=`git stash apply`
gstc=`git stash clear`
gstd=`git stash drop`
gstl=`git stash list`
gstp=`git stash pop`
gsts=`git stash show --text`
gsu=`git submodule update`
gts=`git tag -s`
gtv=`git tag | sort -V`
gunignore=`git update-index --no-assume-unchanged`
gunwip=`git log -n 1 | grep -q -c "--wip--" && git reset HEAD~1`
gup=`git pull --rebase`
gupv=`git pull --rebase -v`
gwch=`git whatchanged -p --abbrev-commit --pretty=medium`
gwip=`git add -A; git rm $(git ls-files --deleted) 2> /dev/null; git commit --no-verify -m "--wip--"`
history=`fc -l 1`
l=`ls -lah`

即便你沒有安裝 zsh 和 oh-my-zsh,個人覺得這些別名的設定還是可以借鑑一下的。

最後說一句:不同的 shell ,alias 配置檔案是不同的,你執行 alias 顯示的也會不同。比如 Mac 預設的 bash,其配置檔案可能是 /etc/bashrc、~/bash_profile 或者 /etc/profile。而 zsh 預設是 ~/.zshrc.

另外,用命令 alias 設定的別名為臨時別名,shell 重啟後就會失效。如: alias la="ls -al" 。如果你重啟了還有效,那可能能在上述配置檔案中找到。^_^

國慶快樂! :)

相關文章