開発3年目のgitエイリアスを整理する

## はじめに

この記事は [ラクス Advent Calendar 2020](https://qiita.com/advent-calendar/2020/rakus) の13日目の記事です。  
開発業務に携わってから早いもので3年が経とうとしています。Gitを使用したバージョン管理を使用しているので、作業がしやすいように五月雨式にエイリアスを追加していたのですが、追加する一方でゴチャっとしてきたので一旦整理しようと思います。

## 整理前

```
[alias]
    st = status
    co = checkout
    cob = checkout -b
    com = commit
    p = push
    pf = push -f
    f = fetch
    fp = fetch -p
    m = merge
    r = rebase
    b = branch
    bm = branch --merged
    bd = branch -d
    bdd = branch -D
    rename = branch -m
    res = reset --soft HEAD^
    s = stash
    sp = stash pop
    sl = stash list
    sc = stash clear
    d = "!f(){ git bm | grep -vE '^\\*|$1$' | xargs -I % git bd %;};f"
    latest = "!f(){ git co $1 && git fp && git r origin/$1 && git d;};f"
    mas = !git latest master
    sbi = "!f(){ git co -b sbi-$1/$2;};f"
```

思ったよりグチャグチャにはなっていませんでしたが、やはり普段使わないコマンドも多く存在します。

## 整理する

#### 使用頻度が少なかったため削除するコマンド

```
[alias]
    st = status
    com = commit
    m = merge
    sl = stash list
    sc = stash clear
```

以上は、純粋に使用頻度が少なかったため削除しました。`git com`は一見よく使いそうなのですが、コミットは統合開発環境（[IntelliJ](https://www.jetbrains.com/ja-jp/idea/)）のGUIを使用するので全くと言っていいほど使いませんでした。他のエイリアスは使用機会はあったはずなのですが、設定していたことを忘れていたため`git status`などのように元のコマンドをそのまま使っていました。その状態で特に困っていたわけではないので思い切って削除しました。（必要になれば簡単に再設定できる程度の内容だというのも削除に踏み切った大きな理由です）

#### 使い勝手が悪かったため削除するコマンド

```
[alias]
    cob = checkout -b
    pf = push -f
```

以上は、使うこと自体はあったのですが人的ミスに繋がりそうなので削除しました。`git cob`は後述する`git sbi`でルールにのっとってブランチを作成しているため、こちらのコマンドをそのまま使用するとtypoしてしまう恐れがありました。`git pf`の方はもっと単純で、フォースプッシュを安易に実行できることに危険性を感じたため削除しました。フォースプッシュしなければならない場合は慎重なコマンド運用をおこなうべきだと思います。

#### 残すコマンド

```
[alias]
    co     = checkout
    p      = push
    f      = fetch
    fp     = fetch -p
    r      = rebase
    b      = branch
    bm     = branch --merged
    bd     = branch -d
    bdd    = branch -D
    rename = branch -m
    res    = reset --soft HEAD^
    s      = stash
    sp     = stash pop
    d      = "!f(){ git bm | grep -vE '^\\*|$1$' | xargs -I % git bd %;};f"
    latest = "!f(){ git co $1 && git fp && git r origin/$1 && git d;};f"
    mas    = !git latest master
    sbi    = "!f(){ git co -b sbi-$1/$2;};f"
```

以上は、使用頻度が高いため残しました。単純な短縮形は特にそのままですが、それ以外のコマンドの使い方だけ簡単に載せておきます。

## 使い方

#### git d

現在のブランチにマージ済みのローカルブランチを削除します。おそらく以下の記事を参考に追加したはずです。

https://qiita.com/hajimeni/items/73d2155fc59e152630c4

ざっくりとだけ解説すると、以下の流れで処理しています。

1. `git bm`
    * マージ済みブランチ一覧を取得
2. `grep -vE '^\\*|$1$'`
    * 削除してはいけないブランチを除外
3. `xargs -I % git bd %`
    * 順番にブランチを削除

ちなみに私はこのコマンド単体では基本的に使わずに、後述の`git latest`の一部として使用しています。

#### git latest (git mas)

```bash
$ git latest master
 # 最新のmaster（リモートの状態も含めて）に移動し、不要なブランチを削除する
````

対象ブランチ（master）に移動して、最新状態にしてからマージ済みブランチを削除します。

1. `git co $1`
    * 対象ブランチに移動
2. `git fp`
    * リモートブランチの内容を取得
3. `git r origin/$1`
    * リベースする
4. `git d`
    * 先のコマンドで対象ブランチにマージ済みのブランチを削除する

基本的にmasterに向けて使用していますが、複数バージョン開発でdevelopブランチのようなものができた場合は、一時的にエイリアスに追加してブランチを切る前に最新の内容を取得するようにしています。

#### git sbi

```bash
$ git sbi 1000 ui_bug_fix
 # sbi-1000/ui_bug_fix というブランチを作成する
```

割とそのままですが、`sbi-xx/xx`の形式のブランチを作成するためだけのコマンドです。  
現在の開発チームではスクラム開発を採用しています。[SBI（スプリントバックログアイテム）](http://agile.blog.jp/agile_scrum/14974352.html)という単位でタスクを分割しており、[Trello](https://trello.com/ja)というオンラインボードツールでタスクを管理しています。絶対のルールではありませんが、ブランチを切る際にTrelloのカード番号と内容をブランチ名に使用しています。毎回のように`git checkout -b sbi-xx/xx`のように入力していると入力量も多くtypoも発生しやすくなるため、一つのコマンドにしてしまいミスが起きにくくしています。

## おわり

他者の`.gitconfg`や`.bashrc`の内容を参考にさせてもらうことは多いのですが、いざ使ってみると自分には合わなかったり思ったより使用していないことが多々あります。今後も便利そうな設定を参考にしたり自分で考えたりしつつ、定期的に棚卸しをしていこうと思います。