Git
AdventCalendar
GitDay 16

gitで便利なエイリアス達

これはGit Advent Calendar / Jun. - Qiita.16日目の記事です.

私はエイリアスが好きなのでgitまわりのエイリアスについて書いてみます.

間違ってたらすみません,指摘してくださると嬉しいです.


設定方法

いろんなスコープにエイリアスを設定できます.

例としてgit stgit statusを実行できるようにしてみましょう.

設定ファイルに書き込む方法と,git configコマンドで設定する方法があります.

設定ファイルに書く場合は以下のようにaliasセクションに短縮形 = 展開形の書式で書きます.

[alias]

st = status

どの設定ファイルに書くかで適用される範囲が変わります.

また,コマンドで設定する場合は,git config [option] alias.短縮形 展開形を実行します.


  • マシン全体に反映させる場合

$(prefix)/etc/gitconfigに書くか,以下のコマンドを実行します.

% git config --system alias.st status


  • ユーザ単位で反映させる場合

~/.gitconfigに書くか,以下のコマンドを実行します.

% git config --global alias.st status


  • リポジトリ単位で反映させる場合

.git/configに書くか,以下のコマンドを実行します.

% git config alias.st status


優先順位

マシンよりユーザ,ユーザよりリポジトリが優先されます.


ぺっくの使ってる設定例


~/.gitconfig

[alias]

# いい感じのグラフでログを表示
graph = log --graph --date=short --decorate=short --pretty=format:'%Cgreen%h %Creset%cd %Cblue%cn %Cred%d %Creset%s'
# 上の省略形
gr = log --graph --date=short --decorate=short --pretty=format:'%Cgreen%h %Creset%cd %Cblue%cn %Cred%d %Creset%s'
st = status
cm = commit
# Untracked filesを表示せず,not stagedと,stagedだけの状態を出力する
stt = status -uno
# 行ごとの差分じゃなくて,単語レベルでの差分を色付きで表示する
difff = diff --word-diff

さらに私の場合はシェルのエイリアスにもこんな感じで設定してgitすら省略しています.


~/.alias

alias pull='git pull'

alias push='git push'
alias st='git status'
alias stt='git status -uno'


その他の便利そうな話


  • 外部コマンド

gitじゃない外部コマンドもエイリアスで実行できます.例えばgit hogeecho hogehogeが実行されるようにするには,

[alias]

hoge = !echo hogehoge

のように!を展開形の前につけると,"git"を取って展開したコマンドを実行できます.


  • 内部コマンド

あと,既に存在するコマンドを上書きするようなエイリアスは無視されるそうです.例えば

[alias]

status = some other command

みたいなのはだめってことだと思います.


  • 引数の区切り

展開形の引数の区切りはスペースで,一般的なシェルでのクォートとかエスケープがサポートされてるそうです.


参考

% man git-config

% git help config


最後に

皆さんの使ってるエイリアスが知りたいのでコメントにいっぱい集まればいいなーなんて


2015/07/23 追記

あれから数年が経ち、いろいろ設定が増えていました。


~/.gitconfig

    # ファイル名のみの差分を表示する

difff = diff --name-only
# staged diff
diffs = diff --cached
dp = diff --no-prefix
dsp = diff --cached --no-prefix
co = checkout
logg = log --graph --all --decorate
log1 = log --pretty='format:%C(yellow)%h%Creset %C(magenta)%cd%Creset %s %Cgreen(%an)%Creset %Cred%d%Creset%C(black bold)%ar%Creset' --date=iso
# lg = log --graph --pretty=format:'%Cred%h%Creset - %s%C(yellow)%d%Creset %Cgreen(%cr:%cd) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
lg = log --graph --pretty=format:'%Cred%h%Creset - %s%C(yellow)%d%Creset %Cgreen(%cr:%cd) %C(bold blue)<%an>%Creset' --abbrev-commit --date=iso
lga = !"git lg --all"
log0 = 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
log2 = 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
log3 = log --graph --date-order -C -M --pretty=format:"<%h> %ad [%an] %Cgreen%d%Creset %s" --all --date=short
log4 = log --graph --pretty='format:%C(yellow)%h%Cblue%d%Creset %s %C(black bold)%an, %ar%Creset'
sgraph = !"git log --oneline --graph"
ancestor = !zsh -c 'diff -u <(git rev-list --first-parent "${1:-master}") <(git rev-list --first-parent "${2:-HEAD}") | sed -ne \"s/^ //p\" | head -n 1' -
unstage = reset HEAD


~/.alias

alias git-submodule-rm="git rm-submodule --no-commit"

# 上のgitconfigで定義したもの
alias gitu="git unstage"
alias reb='git svn rebase'
alias gl="git clone"
# リモートからフェッチ(タグを更新し、削除済みブランチを削除)してpullする
alias gu="git fetch --tags --prune&& git pull origin"


2015/12/09 追記

cherry-pickがめんどくさくなりました。

  cp = cherry-pick


2016/02/16 追記

git flow、git stash用のエイリアスを追加しました。

    ffs = flow feature start

sp = stash pop
ss = stash save


2016/08/23 追記

branch 長い。

    b = branch


2016/08/28 追記

現在のブランチ名を取得する。

使い方

git push origin $(tb)


~/.alias

# this branch

alias tb="git symbolic-ref --short HEAD|tr -d \"\\n\""


2017/02/07 追記

Git LFSのステータスを確認する。

使い方

git stl

stl

stと組み合わせて、st; stl みたいに使い始めました。


~/.alias

alias stl='git lfs status'



~/.gitconfig

    stl = lfs status



2018/02/26 追記

リモートブランチをpercolでインクリメンタル検索して選んでcheckoutする。

プルリクが溜まってくると選ぶときにhelm/anythingライクに絞り込みたくなる。


~/.gitconfig

    cob = !"git branch -r|sed -e 's/origin\\///'|percol|xargs git checkout"


percol。きっと類似ツールでも実現可能。


2018/06/22 追記

現在のブランチ名(Branch Name)を出力する


~/.gitconfig

    bn = rev-parse --abbrev-ref HEAD

# 最後の改行文字を消すならこちら
# bn = !"git rev-parse --abbrev-ref HEAD|tr -d \\\\r\\\\n"