【Git / zsh】git branchを打たずにターミナルにブランチを表示させるための設定

# はじめに
こんにちは、Webエンジニア目指して学習中の**さば**と申します🐟（X：@saba7678pg）

[はじめてのアドベントカレンダー Advent Calendar 2023](https://qiita.com/advent-calendar/2023/first-time) **13日目**として参加させていただきました。

エンジニア界隈の風物詩のようなものでしょうか、初めて実際に混ざることができてとても嬉しいです！
内容は駆け出しが書いた駆け出し向けの簡単な記事ではございますが、誰かしらの参考になりましたら幸いです🙇‍♂️

:::note warn
内容について、引用元を確認したり、手元で動作を確認しながら書かせていただきましたが、
万が一誤りや補足情報等ございましたら、お手数ですがコメント・DM等でお知らせ頂けますと幸いです。
:::

# 今回の記事の対象者
- Macユーザー
- シェルに`zsh`を用いている

# この記事でできること
[![Image from Gyazo](https://i.gyazo.com/b896b146fffda3e21b715deb4424c09e.png)](https://gyazo.com/b896b146fffda3e21b715deb4424c09e)
- 黒塗りで潰している部分には各ユーザーの情報
- `~/Projects/rravel_app` 現在のディレクトリ
- `(develop)` 現在のブランチ

このような表記ができるようになります。

# まずは自身のPCのシェルを確かめる！

bashかzshでやり方が異なるようです。
根本的なところですが、自分のPCのシェルを改めて確認してみましょう。
今回の記事では　`zsh`を対象としていますのでご注意ください！

```zsh
# ターミナルで実行
XXX ~ % echo $SHELL        
/bin/zsh
```

ちなみに、上記のコマンドはログイン時にデフォルトで起動するシェルのパスが表示されているようです。
特に設定してなければ上記で問題ないと思いますが、BashやZshを切り替えたりしている方は、
現在使用しているシェルではなくログイン時のデフォルトシェルが表示される可能性があります。

``` zsh
# ターミナルで実行
$ echo $0
-zsh
```
上記は現在のシェルを確認するコマンドなので、必要に応じて試してみてください。

# Gitのプロンプトをダウンロードする
ターミナルにブランチを表示させるためのプロンプトをダウンロードします。

``` zsh
# ターミナルで実行

mkdir ~/.zsh
cd ~/.zsh

curl -o git-prompt.sh https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh
```

※誤ってダウンロードしたり操作をやり直したい場合等は、該当ディレクトリで`rm ~/.zsh/git-prompt.sh`で削除ができます。

### 【コマンド解説】

`mkdir ~/.zsh` `cd ~/.zsh`　
- 基本的なコマンドですが、これはホームディレクトリに`.zhs`というディレクトリを作成し、そのディレクトリに移動するための操作です。
- `.zsh`ディレクトリはZshの設定ファイルやカスタマイズスクリプトなどを整理して保管するための場所として用います。

`curl -o git-prompt.sh https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh`
[ソース元](https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh)
<details><summary>（補足）git-prompt.shの記載内容</summary>

- ソース元を見ていただきますと英文字の羅列が記載されています😱
- 今回ブランチ表示に関わる部分としてスクリプトの中核を担うのが`__git_ps1`関数です。スクリプトによって現在の作業ブランチの名前を取得し、ターミナルに表示するための関数が記載。
- その他未コミットの変更表示やスタッシュ状態の表示等様々なカスタイマイズのためのコードが記載されています。
</details>

- Gitリポジトリからgit-propmt.shスクリプトをダウンロードします。
  - `curl` URLを使用してインターネットからデータを転送するために使用。
  - `-o　git-prompt.sh` curlでダウンロードしたデータを保存するファイル名を指定。今回はgit-prompt.shというファイル名で保存される。
  - `URL部分`　DLするデータのソースを指定。

# `.zshrc`ファイルに設定を記載する

ここまでの工程でダウンロードしたファイルを読み込めるよう、`.zshrcファイル`に設定を追記します。
おそらくルートディレクトリに隠しファイルとして保存されていると思います。
`Shidt + Cmd + .`で隠しファイルを表示するか、ターミナルから直接開いてみましょう。

``` zsh
# .zshrc
# 以下をファイル内に追記する

source ~/.zsh/git-prompt.sh

GIT_PS1_SHOWDIRTYSTATE=true
GIT_PS1_SHOWUNTRACKEDFILES=true
GIT_PS1_SHOWSTASHSTATE=true
GIT_PS1_SHOWUPSTREAM=auto

setopt PROMPT_SUBST ; PS1='%F{green}%n@%m%f: %F{cyan}%~%f %F{red}$(__git_ps1 "(%s)")%f
\$ '

```

### 【コード解説】
- `source ~/.zsh/git-prompt.sh` git-prompt.shスクリプトの読み込み。このファイルにGitリポジトリの情報（ブランチ名など）をプロンプトに表示する機能が含まれている。
- `GIT_PS1...` git-prompt.shによって提供されるプロンプトの表示についてのオプション設定

|GIT_PS1...|説明|代替コマンド|
|:--:|:--|:--|
|`...SHOWDIRTYSTATE=true`|作業ディレクトリに未コミットの変更がある場合、ブランチ名の隣に`*`を表示。|`git status`|
|`...SHOWUNTRACKEDFILES=true`|未追跡のファイルがある場合、ブランチ名の隣に`%`記号を表示|`git status`|
|`...SHOWSTASHSTATE=true`|スタッシュされた変更がある場合、ブランチ名の隣に`$`を表示。|`git stash list`|
|`...SHOWUPSTREAM=auto`|現在のブランチとリモートのブランチとの関係を示す。現在のブランチがリモートブランチより遅れている場合は`<`、進んでいる場合は`>`が表示される。|`git branch`や`git branch -vv`の代替要素。|

- `setopt PROMPT_SUBST ; PS1='%F{green}%n@%m%f: %F{cyan}%~%f %F{red}$(__git_ps1 "(%s)")%f
\$ '`
    - プロンプトのフォーマットを設定し、`__git_ps1`関数を使用してGitの情報を表示するためのコード。
    - `setopt PROMPT_SUBST` プロンプト内でのコマンド置換が有効になる。
    - `PS1=` プロンプトのフォーマット設定
        |コード|内容|
        |:--|:--|
        |`%F`|色の設定。ここでは緑色のフォントを設定し、特に指定がなければ`%f`はデフォルトのフォント色となる。|
        |`%n`|ユーザー名|
        |`%m`|マシン名|
        |`%~`|現在のディレクトリ（ホームディレクトリは ~ と表示）|

    - `$(__git_ps1 "(%s)")` git-prompt.shスクリプトの関数を呼び出し、Gitリポジトリの情報を表示。`(%s)`はGit情報のフォーマットを指定。

# 更新したファイルの再読み込み

``` zsh
# ターミナルで実行
source ~/.zshrc
```
最後に追記内容を反映させるためにターミナルで上記を実行し、ファイルを読み込み直し、ターミナルを再起動しましょう。
gitを扱っているディレクトリに移動し現在のブランチが表示されていれば成功です🐟💨

# 引用
https://zenn.dev/tokuyuuuuuu/articles/362e0410a997e1

https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh

https://qiita.com/mikan3rd/items/d41a8ca26523f950ea9d