Mac で git rebase master を自動でやるバッチ（.command）

チーム開発をしていると、何度も何度も使う git rebase master を自動でやるバッチ（.command）を作成したので紹介します。
応用篇では現在の作業ブランチをバックアップするバッチも紹介しますので、ご興味のある方は是非読んで下さい。

不慣れな bash なので、あまり良いコマンドではないかもしれませんが、ご指摘あればコメントお願いします。改善、改善。

# 手順

* .command ファイル作成
* 実行権限を付与
* .gitignore（任意） 
* .command 実行


## git_rebase_master.command ファイル作成

**git_rebase_master.command**
以下のコマンドファイルをテキストエディタなどにコピペして作成してください。

```Bash:git_rebase_master.command
#!/bin/bash

# ex) [clone]/util_command/[FILE_NAME].command

# [Notice] At first, execute chmod command manually if needed
# ex) $ chmod u+x [FILE_NAME].command

# Move dir
MY_DIRNAME=$(dirname $0)
COMMAND="cd $MY_DIRNAME"
echo "  $ $COMMAND"; $COMMAND

COMMAND="cd .."
echo "  $ $COMMAND"; $COMMAND

# Check CURRENT_BRANCH
COMMAND="git symbolic-ref --short HEAD"
echo "  $ $COMMAND"

CURRENT_BRANCH=$($COMMAND)
echo "  ---------- [CURRENT_BRANCH] = [$CURRENT_BRANCH] ----------"
if [ -z "$CURRENT_BRANCH" ]; then
	echo "  ---------- [ERROR] Failed to get CURRENT_BRANCH ----------"; exit
elif [ "${CURRENT_BRANCH}" = "master" ]; then
	echo "  ---------- [WARNING] CURRENT_BRANCH is master ----------"
fi

# Git command
COMMAND="git remote update"
echo "  $ $COMMAND"; $COMMAND

COMMAND="git checkout master"
echo "  $ $COMMAND"; $COMMAND

COMMAND="git pull"
echo "  $ $COMMAND"; $COMMAND

COMMAND="git checkout $CURRENT_BRANCH"
echo "  $ $COMMAND"; $COMMAND

COMMAND="git rebase master"
echo "  $ $COMMAND"; $COMMAND

echo "  ---------- [Success] Rebase completed ----------"
```

**.commandファイルの配置場所**
ex) [clone]/util_command/[FILE_NAME].command
今回のサンプルでは .git と同じディレクトリに util_command フォルダを作成して、そのフォルダ直下に .command ファイルを配置してます。
※フォルダ名は何でも構いません。

**拡張子 .command**
拡張子 .command でファイル保存すると、MacOSのダイアログが出るので[use .command]を選択してください。


## 実行権限を付与

**.command ファイルがあるディレクトリに移動**
ターミナルで "cd "の後に .command ファイルがあるフォルダをドロップすれば、パスが自動入力されます。

**$ chmod u+x [FILE_NAME].command**
ターミナルから上記コマンドを実行して、.commandファイルに実行権限をつけてください。
[Macでバッチファイル(.command)を作る](https://qiita.com/D4ik1/items/612ab978a32ae4c17553)

## .gitignore（任意） 

**無視リスト（.gitignore）に .command ファイルを追加**
util_command ディレクトリごと Git のグローバル無視リストに追加しておけば、気兼ねなくプロジェクトフォルダ内から使えます。
SourceTreeならGUIでぱぱっと設定出来ます。
「以下を全て無視:」からディレクトリごと無視リストに追加するのが一番楽です。


手動で設定するなら以下のサイトを参考にしてください。
[Git でグローバルな .gitignore を作成する](https://qiita.com/takuya0301/items/29187aa088d04cf92659)


## .command 実行

あとは.commandファイルをダブルクリックするだけで実行されます。

**.command 実行時に「開発元が未確認のため開けません」とアラートが表示される時の対処法**
control押しながらクリック、開くを選択するのが一番楽です。
[mac > xxxは、開発元が未確認のため開けません。> control押しながらクリック、開くを選択](https://qiita.com/7of9/items/c99e1bf865c6eaa7bda0)
[アプリケーション起動時に「開発元が未確認のため開けません」とアラートが表示されます](https://www.too.com/support/faq/mac/23481.html)

一度許可（開く）をするとアラートは表示されないので、それ以降はダブルクリックで実行できます。

**備考**
人によっては環境により実行出来ないケースなどがあるかもしれませんが、あとは自己責任でお願いします。（ちょっと弱気）


# 応用篇

## git_branch_backup.command

現在の作業ブランチのバックアップをとっておくバッチです。（個人的にはこれが一番よく使っています）
checkoutはしてないので、作業ブランチはそのままです。

上記と同じ手順で git_branch_backup.command ファイルを作成してください。

```Bash:git_branch_backup.command
#!/bin/bash

# ex) [clone]/util_command/[FILE_NAME].command

# [Notice] At first, execute chmod command manually if needed
# ex) $ chmod u+x [FILE_NAME].command

# Move dir
MY_DIRNAME=$(dirname $0)
COMMAND="cd $MY_DIRNAME"
echo "  $ $COMMAND"; $COMMAND

COMMAND="cd .."
echo "  $ $COMMAND"; $COMMAND

# Check CURRENT_BRANCH
COMMAND="git symbolic-ref --short HEAD"
echo "  $ $COMMAND"

CURRENT_BRANCH=$($COMMAND)
echo "  ---------- [CURRENT_BRANCH] = [$CURRENT_BRANCH] ----------"
if [ -z "$CURRENT_BRANCH" ]; then
	echo "  ---------- [ERROR] Failed to get CURRENT_BRANCH ----------"; exit
elif [ "${CURRENT_BRANCH}" = "master" ]; then
	echo "  ---------- [WARNING] CURRENT_BRANCH is master ----------"; exit
fi

# Backup current branch
BACKUP_BRANCH_NAME=$CURRENT_BRANCH"_Back/"$(date +"%Y_%m%d_%H%M%S")
echo "  ---------- [BACKUP_BRANCH_NAME] = [$BACKUP_BRANCH_NAME] ----------"

COMMAND="git branch $BACKUP_BRANCH_NAME"
echo "  $ $COMMAND"; $COMMAND

echo "  ---------- [Success] Backup current branch ----------"
```

**バックアップ用のブランチ名**
バックアップ用のブランチ名は以下になります。
[CURRENT_BRANCH_NAME]_Back/YYYY_MMDD_hhmmss
[日時表示のフォーマットのサンプル](https://hydrocul.github.io/wiki/commands/date.html)

**ブランチ名に"/"**
バックアップ用のブランチ名に / を付けておくと、SourceTreeではグルーピング出来るので人によっては便利です。
[年月を入れる](https://qiita.com/yousan/items/f0801437644527b00342#年月を入れる)

**[注意]SourceTreeへの反映遅れ**
SourceTreeを使っている場合、すぐに反映されない時がありますが、SourceTreeの表示を切り替えると反映されます。
「現在のブランチ」と「すべてのブランチ」を切り替えるなど


# おわりに

ここまで出来れば、あとは他にもいろいろ応用ができると思いますので、可能性は無限大です。
何度も繰り返し使う cherry-pick 集を用意しておくととても便利ですので、みなさまも良いバッチがあれば公開してください。

Mac で Git コマンドを自動でやるバッチ（.command）の情報が少なかった（自分でうまく見つけられなかった）ので、今回記事にしてみました。

ちなみに zsh 環境では試してないので、正常に動作するかは分かりません。
zsh 環境で試して、正常に動作する方がいらしたら、コメント下さいませ。:汗: