【git】まれに使用するエイリアス6選

2022-01-23

gitでたまによく使う操作、だからどうも覚えられないというものがある。 そういうものはエイリアスとして登録しておくと便利。

リモートブランチのチェックアウト

リモートにあるブランチをローカルでチェックアウトしたい場合はどういうコマンドになるか?

$ git branch <ローカルでチェックアウトするブランチ名> <リモート名/リモートのブランチ名>
# 例
$ git branch foobar origin/foobar #=>

まあ覚えてしまえばなんてことはないんだけど大抵リモートのブランチ名のままローカルにもチェックアウトすると思うので、二度タイプするのが面倒。

そこで rco (Remote Check-Out)というエイリアスを考える。 使い方:

# git rco [リモート名(省略可)] <ブランチ名>
$ git rco foobar #=> originのfoobarをチェックアウト
$ git rco other-remote baz #=> other-remoteのbazをチェックアウト

リモート名を省略して1引数にすると origin として扱う。

.gitconfig へのエイリアス登録は以下の通り:

#.gitconfig

[alias]
...
rco = "!sh -c 'if [ -z \"$2\" ]; then git branch $1 origin/$1; git switch $1; else git branch $2 $1/$2; git switch $2; fi;' -"

チェックアウトしたブランチに自動的にスイッチされる。

リモートブランチの削除

逆にリモートにあるブランチを削除するにはどうするか。

$ git push --delete <リモート名> <ブランチ名>...
# 例
$ git push --delete origin foobar #=> originのfoobarブランチを削除

リモートが対象とはいえ「ブランチの削除」がgit pushというところがどうも覚えられなくて毎回調べてしまう。 そこで remove-remote-branch というエイリアスを定義する(危険な操作なのでコマンド名を冗長に):

# git remove-remote-branch <ブランチ名>、または git remove-remote-branch <リモート名> <ブランチ名>
$ git remove-remote-branch foobar
$ git remove-remote-branch other-remote foobar

.gitconfig へのエイリアス登録は以下の通り:

[alias]
remove-remote-branch = "!sh -c 'if [ -z \"$2\" ]; then git push --delete origin $1; else git push --delete $@; fi' -"

マージ済みリモートブランチの削除

GitHubのプルリクエストでマージされたブランチは削除しないと溜まる一方になる。 そういう状態だと新規に作るブランチ名やzshの補完で面倒なことになるので削除したい。

[alias]
remove-merged-branches = !git branch -r --merged main | grep -v -e production | sed -e 's% *origin/%%' | xargs -I% git push --delete origin %

いろいろ前提があるので気をつける必要がある:

  • 開発ブランチ: main
  • リリースブランチ: production
  • リモート名: origin

少し危険なので事前に確認として、最後の | xargs ... を実行しないdry-runを行なったほうがいいかもしれない。

メインブランチにリベース

他人のコミットなどでメインブランチが更新された場合に、履歴をきれいにするためにローカルで作業中のブランチをリベースすることが非常によくある: rtm (Rebase To Main)

[alias]
rtm = rebase main

ツリー表示

Sourcetree などのGUIアプリが使える場合にはそれでいいんだけど、そうじゃない場合には困る。 tig などを入れて操作を覚えればいいんだけど、その手間も省きたい怠惰な人は tree

[alias]
tree = log --graph --branches --date=short --format=\"%C(yellow)%h %C(magenta)%ad%C(auto)%d%C(reset) %C(bold)%s%C(reset) %C(cyan)%an\"

エイリアス一覧

git config --list して grep '^alias' でも全然いいんだけども。

[alias]
alias = config --get-regexp \"alias.*\"