コマンドを作成してGit操作を効率化する

## 概要
普段のGit操作をコマンドを作成することで効率化を図りました。

※こちらの記事を応用したものになります。

https://qiita.com/masumoto_rsk/items/87d671044e80b25acfa3

## 前提
`PhpStrom`のターミナルで操作することを前提としています。（VS Codeでも可です）
シェルは`zsh`を使用しています。（ご使用のシェルが異なる場合は、ご使用のシェルに合わせて変更してください）
![スクリーンショット 2021-08-18 22.08.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616723/7a30d59f-7239-11e5-386a-afa171b23f81.png)


以下をインストールしてください。

- GitHub CLI
- peco

https://cli.github.com/

https://github.com/peco/peco


## 作成したコマンド
###1. リポジトリをブラウザで開く
GitHub上でissueを確認することが多いので、現在の作業リポジトリを指定した場合はissue一覧画面が開くようにしています。
他リポジトリを指定した場合はGitHubのCodeの画面が開きます。

```zsh
og() {
  target=`find ~/GitRepository -type d -maxdepth 1 | sed -e '1s/.*/./g' |cut -d / -f 5 | peco`
  if [ "$target" = "." ]; then
    gh issue list --web
  elif [ "$target" != "" ]; then
    gh repo view github.com/eyemovic/"$target" --web
  else
    echo 'Cancel open GitHub' >&2
  fi
}
```
###2. リモートブランチ（プルリクエスト）をローカルにチェックアウト
プルリクエストされたリモートブランチをローカルに取り込んで動作確認を行いたい場合によく使用します。

```zsh
rb() {
  target=`gh pr list | peco --prompt "GIT REMOTE BRANCH>" | awk '{print $1}'`
  if [ "$target" != "" ]; then
    gh pr checkout "$target"
  else
    echo 'Cancel checkout remote' >&2
  fi
}
```

###3. issueからブランチ作成
自動的に選択したブランチから切って`feature/issue_番号`、または`hotfix/issue_番号`のブランチを作成します。
また、作成と同時に選択したissueに`対応中`、または`doing`のラベルを付けます。（GitHub上で`対応中`、または`doing`のラベルが設定されていれば）
![画面収録 2021-08-18 22.51.00.mov-4331C4B5-8537-4031-9061-9E4D104393E6.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616723/29ef23fe-ed14-d5c9-9a9d-c605fac37d69.gif)

```zsh
ib() {
  target=`gh issue list | peco --prompt "GIT ISSUE BRANCH>"`
  if [ "$target" != "" ]; then
    number=`echo "$target" | awk '{print $1}'`
    branch=`echo 'develop\nmaster' | peco --prompt "SELECT THE BRANCH YOU WANT TO CREATE FROM>"`
    if [ "$branch" = develop ]; then
      gh issue edit "$number" --add-label "対応中"
      gh issue edit "$number" --add-label "doing"
      git checkout develop && git pull && git checkout -b feature/issue_"$number"
    elif [ "$branch" = master ]; then
      gh issue edit "$number" --add-label "対応中"
      gh issue edit "$number" --add-label "doing"
      git checkout master && git pull && git checkout -b hotfix/issue_"$number"
    else
      echo 'Cancel create issue branch' >&2
    fi
  else
    echo 'Cancel create issue branch' >&2
  fi
}
```
###4. 現在のブランチでプルリクエスト作成
選択したブランチへプルリクエストを作成します。
作成と同時に以下が自動で設定されるようになっています。

- タイトル
- 本文
- アサインを自分に割り当て
- reviewableのラベル
- issueのラベルをreviewableに切り替え

あとはレビュー者を指定するだけです。

![画面収録 2021-08-18 22.38.30.mov-76C4625A-C470-4968-A22E-ACF2DA8FBFEF.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616723/17e91534-4426-a6cc-1dad-99e43e5ea19c.gif)


```zsh
cpr() {
  current_branch=`git branch --contains | sed -n '/^*/p' | awk -F "/" '{print $2}'`
  number=`echo "$current_branch" | awk -F "_" '{print $2}'`
  target=`gh issue list | grep "^$number"`
  text=`echo "$target" | awk '{print $3}'`
  base_branch=`echo 'develop\nstaging\nmaster' | peco --prompt "SELECT THE BRANCH TO MERGE INTO>"`
  if [ "$base_branch" != "" ]; then
    gh issue edit "$number" --remove-label "対応中" --add-label "レビューOK"
    gh issue edit "$number" --remove-label "doing" --add-label "reviewable"
    gh pr create -B "$base_branch" -t "#$number $text" -b "
Closes #$number
@

ご確認よろしくお願いします。
" -a "@me" -l "レビューOK,reviewable" -w
  else
    echo 'Cancel create pull request' >&2
  fi
}
```

###5. 試験環境、本番環境へプルリクエスト作成
反映先ブランチを選択して、タイトルに自動で日付が入るようにしています。

```zsh
dpr() {
  today=`date '+%Y年%m月%d日'`
  base_branch=`echo 'staging\nmaster' | peco --prompt "SELECT THE BRANCH TO MERGE INTO>"`
  if [ "$base_branch" = staging ]; then
    gh pr -H develop create -B "$base_branch" -t "【試験環境反映】$today" -a "@me" -w
  elif [ "$base_branch" = master ]; then
    gh pr -H staging create -B "$base_branch" -t "【本番環境反映】$today" -a "@me" -w
  else
    echo 'Cancel create deploy pull request' >&2
  fi
}
```
###6. ローカルブランチの切り替え
ブランチの切り替えと同時にpullして、リモートブランチとの差をなくすようにしています。
![画面収録 2021-08-18 22.51.59.mov-C2482C36-E625-4EE7-8048-BA04C3929957.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616723/e2174a01-3f63-cfb2-913b-9ed0e43a0596.gif)


```zsh
lb() {
  target=`git branch | peco --prompt "GIT LOCAL BRANCH>" | sed -e "s/^\*\s*//g" | awk '{print $1}'`
  git checkout "$target" && git pull
}
```