git status -s でちょっと幸せになれる

## 概要
どうもこんにちは。既視感のあるタイトルです。([以前に似たようなタイトルの記事](https://qiita.com/tommy_aka_jps/items/6ce68f564cb3802ca9b0)を書いたせいですね。)

今日は久しぶりの Git 系の記事いってみます。タイトルのとおりお題は `git status` についてです。 Git を使ったことのある方々にはお馴染みのコマンドかと思います。

## `git status` って？
軽く説明します。釈迦に説法と思われた方は読み飛ばしてください^^;
公式ドキュメントでは以下のように説明されています。

- [Git - git-status Documentation](https://git-scm.com/docs/git-status)

> Displays paths that have differences between the index file and the current HEAD commit, paths that have differences between the working tree and the index file, and paths in the working tree that are not tracked by Git(and are not ignored by gitignore).

上記を踏まえて簡単にまとめますと **下記3点を表示するコマンドが `git status` と言えます。**

- `git add` されているけどまだ `git commit` されていないファイルの一覧
- 編集・変更・削除されているが、まだ `git add` されていないファイルの一覧
- Git管理されていない、かつ `.gitignore` で管理除外対象にもされていないものの一覧

実際のプロンプト表示はこのようになります。
![git_status_before.png](https://qiita-image-store.s3.amazonaws.com/0/70638/bbed1877-3344-feb1-cfe3-3166c5d45123.png)
こんなかんじです。`git status` の概要はだいたいつかめたかと思います。

## `-s` オプションについて
さてタイトルの件に戻ってきました。`-s` は `--short` のエイリアスです。short ということでその名のとおり短い書式で表示してくれるオプションです。先ほどのキャプチャと同じ状況で今度は `-s` を付けてみます。すると以下のように表示されます。
![git_status_after.png](https://qiita-image-store.s3.amazonaws.com/0/70638/7aa39615-c4a2-5b24-e7de-88864aac7f37.png)
**うお、みじかっ！**
バカな、短すぎて説明用のテキスト画像を挿入する隙間もなかったぜ…
ざっくり補足します。

|表示|説明|
|:---:|:---:|
|<font color="green">**M_**</font>|`git add` されているけどまだ `git commit` されていないファイルの一覧|
|<font color="red"> **_M**</font>|編集・変更・削除されているが、まだ `git add` されていないファイルの一覧|
|<font color="red">**??**</font>|Git管理されていない、かつ `.gitignore` で管理除外対象にもされていないものの一覧|

ということですね。
変更ファイルが多い作業になってくると git status の出力結果も地味に長くなるので、そんなときにはこのオプションを使うとちょっと作業が楽になるかもしれません。**特に VScode で開発している方は、統合ターミナルの限られた表示領域で `git status` したときにこそこのオプションが真の力を発揮できると思います。**ぜひおためしください。

ちなみにショートフォーマット時の詳しい書式は下記に載ってますので興味のある方はご覧ください。

- [git-status#short_format - Git](https://git-scm.com/docs/git-status#_short_format)



## おまけ
- [Git - git-status - options](https://git-scm.com/docs/git-status#_options)

他にもいろいろオプションがあります。気になったものをいくつかおまけ的につまんでみます。

### `-b`(`--branch`)

![git_status-branch.png](https://qiita-image-store.s3.amazonaws.com/0/70638/aa3738a9-74c5-e2bf-53a6-44f25b644966.png)
現在のブランチ情報を表示するオプションです。なんですが、<font color="red">**`-s`等の簡易表示オプションと一緒に使わないと何もおきません。**</font>まてあわてるなこれは孔明の罠だ(死語

ということで `-s` オプションと併用して `-sb` と指定してます。

ちなみに公式には記載がちゃんとありました。罠とか言ってごめんなさい。
> Show the branch and tracking info even in short-format.

とにかく `-s` と `-b` は常時セットで使うとよさげなのでおすすめします。ブランチ名あっても邪魔にはなりませんしね。

### `-u`(`--untracked-files`)
untracked files の表示有無を切り替えられるオプションです。
https://git-scm.com/docs/git-status#Documentation/git-status.txt--ultmodegt

```git:書式
git status -u<mode>
```

|mode|説明|
|---|---|
|no| untracked files は表示しない |
|normal| デフォルト。つまり `-u` オプションなしと同じ |
|all| untracked files のディレクトリ内まで細かく表示 |

例えば untracked files は表示したくない場合はこんなかんじです。`-uno` のように **オプションと mode はスペースを空けずに続けて書いてください。**

```sh
$ git status -uno
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   a.txt

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   b.txt

Untracked files not listed (use -u option to show untracked files)
```

以下のように `-s`と`-b`オプションと組み合わせると便利です。

```
$ git status -sbuno
## master
M  a.txt
 M b.txt
```


### `--porcelain`
- [Git - 配管（Plumbing）と磁器（Porcelain）](https://git-scm.com/book/ja/v2/Git%E3%81%AE%E5%86%85%E5%81%B4-%E9%85%8D%E7%AE%A1%EF%BC%88Plumbing%EF%BC%89%E3%81%A8%E7%A3%81%E5%99%A8%EF%BC%88Porcelain%EF%BC%89)

公式によると Porcelain = 磁器って書いてあります。読んでみましたが、**正直よくわかりませんでした＼(^o^)／**

まあ実際使ってみればわかるでしょう、ということでコマンド打ってみました。

![gitstatus-porcelain.png](https://qiita-image-store.s3.amazonaws.com/0/70638/5589f711-8620-5c01-a54a-dada50d0a3e8.png)
あれ、 `-s` オプション実行時と書式は同じですね。色が消えましたが。すみませんが用途はいまひとつわかりませんでした。**`-s` でええやん。**というのが正直な感想です。

### `-v`(`--verbose`)
![gitstatus-v.png](https://qiita-image-store.s3.amazonaws.com/0/70638/76afdc31-429e-053e-9975-27aa7111de2a.png)
`git diff` の結果も一緒に表示してくれるオプションです。あまり使うことはなさそうですが、覚えておくと何かの際に役立つこともあるかもしれません。(あるとは言ってない)


### `-z`
聞きなれないオプションです。とりあえず公式ドキュメントをみてみます。

> Terminate entries with NUL, instead of LF. This implies the --porcelain=v1 output format if no other format is given.

改行コード(LF)の代わりに NUL でエントリを終了します、って書いてあるようです。改行が全部なくなるってことでしょうか。コマンドを打って確認してみます。
![gitstatus-z.png](https://qiita-image-store.s3.amazonaws.com/0/70638/9ee3cca2-7740-bef5-364e-8d68c62fb743.png)
<font color="red">**ほんとに改行全部なくなりました。**</font>
極限に短い git status 表記を目指すのであれば `-z` オプションを使えば最短になりますね。あと、`-b` と `-z` はもちろん併用可能なので、`git status -bz` で**夢のB'zオプションが実現できます。**すみません、ふざけすぎました。

これもどういう使い道があるんでしょうかね？ご存知の方いらっしゃいましたらぜひご一報ください。

2019/6/29追記：
@sounisi5011 さんから `-z` の用途についてすごく有用なコメントをいただきました。ありがとうございます。
https://qiita.com/tommy_aka_jps/items/af536a7c20747f99aa42#comment-4960d1add337965d1620
 




## おわりに
`git status -s(b)` が地味に便利なので知らなかった人はつかってみてくださいって記事を書こうとしただけのはずだったんですが、気がついたらおまけのほうが長くなってました(ありがち

ではまた。