fishでgitコマンドを一括で実行してくれる関数を作ってみる

# 完成系がこちら
`push_staging_color` という自分で作ったコマンドを打つと
git系のコマンドが連続で実行されてますね。
![スクリーンショット 2020-12-17 14.30.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387055/e6b25c2a-5ae6-dd37-d6a6-e5325f710e66.png)

# では作っていきましょう
## fishには関数を作るための専用ファイルがある
Macはこちらのディレクトリにあるはず
.config/fish/functions/

この中に `コマンド名.fish` っていうファイルを作って関数を書いていけば自作のコマンドで実行できるはずだ。

## ファイルを作ってみる
自分は今回stagingというブランチに自分の開発しているbrachをmergeするまでのコマンドを書いていくつもりなのでstagingという名前にしました。
![スクリーンショット 2020-12-17 14.54.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387055/b4b90ac5-191d-78d5-bcd5-475e7f52b9e2.png)

## 中身を書いてみる
今回やりたいことは
自分で入力したブランチ名を叩けば、git fetchとかgit mergeとか自動的にやってくれるようにします。

まず自分のブランチ名を入力したいので `git branch` でブランチ名を表示させてコピペできるようにします。
その後、ブランチ名入力モードに移動し、ブランチ名を入力するとgitのあれこれを実行させます。

コードはこんな感じになります。

```
function push_staging
    git branch \
    && read branchName \
    && git checkout master \
    && git fetch \
    && git branch -D staging \
    && git checkout -b staging origin/staging \
    && git merge "$branchName"
end

function push_staging_display
    echo "> git branch" \ && git branch \
    && read branchName \
    && echo "> git checkout master" \ && git checkout master \
    && echo "> git fetch" \ && git fetch \
    && echo "> git branch -D staging" \ && git branch -D staging \
    && echo "> git checkout -b staging origin/staging" \ && git checkout -b staging origin/staging \
    && echo "> git merge <branchName>" \ && git merge "$branchName"
end

function push_staging_color
    echo -e "\e[93m> git branch \e[97m" \ && git branch \
    && read branchName \
    && echo -e "\e[93m> git checkout master \e[97m" \ && git checkout master \
    && echo -e "\e[93m> git fetch \e[97m" \ && git fetch \
    && echo -e "\e[93m> git branch -D staging \e[97m" \ && git branch -D staging \
    && echo -e "\e[93m> git checkout -b staging origin/staging \e[97m" \ && git checkout -b staging origin/staging \
    && echo -e "\e[93m> git merge <branchName> \e[97m" \ && git merge "$branchName"
end

```

下記のコマンドで実行できます。

```
staging
```

```
push_staging_color
```


## 処理内容の解説
・ ご覧の通り三種類の関数があります。
・それぞれの違いを見るために実際にコマンドを叩いてみましょう。
・ functionのあとの名前が実際の実行コマンドになります。
・ 一番最初のfunctionのコマンドを叩いてみましょう
・ ファイル名を叩きます。自分の場合はstagingです。
・ その後functionのあとのコマンドを打ちます。
![スクリーンショット 2020-12-17 15.33.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387055/83f7e556-4bbc-770e-f923-c6ce95003b25.png)

・ やりたいことは全部実行してくれましたが何が実行されたのかあまりわからないですね。
・ ここでもしエラーが出た時にどのコマンドでエラーがでるのかわからないのが不便ですね。
・ コマンドを実装する前に実行コマンドを表示させるようにしたいですね。

・では二番目の関数を実行してみましょう
![スクリーンショット 2020-12-17 15.44.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387055/56a39a17-f616-9252-a336-958c3ba76b96.png)

・ 実行コマンドが表示されましたね。
・ 一つ目との関数との違いはechoを入れるか入れないかですね。
・ ただechoした内容とその結果が同じ色なので見づらいですね。
・ echo した内容の色付けをしたいですね。

同じように三番目の関数を実行しましょう
![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_387055_e9cf7502-1eff-ee74-ceda-72ee96ab164a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387055/75e31ecf-c746-53cd-3dd7-50037327e88b.png)


echoするときに色をつけるようにしました。

今回はfishでの関数の作り方と使い方を参考程度にアップしました。

処理内容やコードの書き方はご自身で検索してみてください。

今後、気が向いたら下記のコードの意味を解説していこうかなって考えています。
`\` `&&` `read 変数名` `$変数名`