Git レビューする時に使うコマンド

## 目的

タスクの作業途中にレビュー依頼を受けた時のコマンドをまとめました。
深夜テンションで書いたのでおかしいところがあったらコメントにて教えてください🙏

## 環境

```shell-session
$ git --version
git version 2.26.2
```

## 事前準備

### まずは自分の作業ブランチでコミットする

```shell-session
$ git status
$ git diff

$ git add
$ git commit
```

レビューを始める前に自分の作業ブランチでコミットできるものはコミットしておきましょう。

### 作業途中のコードを一時的に退避する

```shell-session
$ git stash -u
```

急いでレビューしたい時はスタッシュで退避させておきます。
`-u` オプションを指定すると `untracked file` も含めて退避します。

```shell-session
$ git add -A
$ git commit -m wip
```

しばらく戻って来ないようなら、一旦コミットしてしまうのも良いかなと思います。

## 退避した内容を確認する

```shell-session
$ git stash list
$ git stash show -p
```

Gitのことを信頼してるので、あまり内容を確認することはないです。

## ローカルリポジトリを最新の状態にする

```shell-session
$ git fetch
```

これを忘れるとレビューするブランチ見つからないやん🤔ってなります。

## レビューしたいブランチに切り替える

```shell-session
$ git switch topic-xxx
```

ローカルリポジトリを最新の状態に更新して、レビューしたいブランチに切り替えます。(`checkout` は使わないゾという強い意志)

## ビルド＆キャッシング

```shell-session
$ docker compose down --rmi all -v # 必要に応じて
$ docker compose up -d # 必要に応じて
$ yarn # 必要に応じて
$ yarn dev # yarn watch
$ composer install # 必要に応じて
$ composer dump-autoload
$ cp .env.example .env # 必要に応じて
$ php artisan migrate # 必要に応じて
$ php artisan db:seed # 必要に応じて
$ php artisan optimize
$ php artisan test
$ php artisan migrate:rollback # 必要に応じて
```

変更されているファイルに応じてビルドし直したり、キャッシュし直したりします。(内容はプロジェクトによりますが)

## レビューする

魚の骨が喉につっかえてしまうようなコードがないか確認して問題なければLGTMです。
レビューする時に使うコマンドを補足でご紹介します。

レビュー用に[ウェブ設計チェックリスト](https://qiita.com/ucan-lab/items/85ddbd8948002e3e28b1)作りました。チェックリストとソースコードを照らし合わせてレビューします。

### 補足: git log

コミットのログを表示します。

```shell-session
$ git log
$ git log --one-line
$ git -P log --one-line
```

`-P` Git全般のオプションですが、ページャーなしで一気に表示します。地味に便利かもです。

```shell-session
$ git log --oneline --graph --decorate --name-status
```

オプション指定すれば良いってもんじゃないですけど、`git log` のオプションめちゃくちゃいっぱいあります。

- `--one-line` 1コミット1行で表示
- `--graph` グラフっぽい表示
- `--decorate` ブランチ名、タグ名等の別名表示
- `--name-status` ファイル名を表示

参考: [git log よく使うオプションまとめ](https://qiita.com/take4s5i/items/15d8648405f4e7ea3039)

### 補足: git show

```shell-session
$ git show
$ git show -1
$ git show -2
$ git show -3
```

`git show` と `git show -1` は同じく最新のコミットの内容を表示します。
数値の代わりにハッシュ値を指定してもokです。

### 補足: git diff

```shell-session
$ git diff master
$ git diff master --name-only
```

他のブランチとの差分を見ることができます。
1個1個のコミットを見るのめんどいよって方はこちら。

`--name-only` 差分のあるファイル名のみ一覧表示

```shell-session
$ git diff master --color=always | less -R
```

`git diff` の結果を less を使って表示したい時はこんな感じで表示します。オプションを付けないとうまく色付け表示できないので注意です。

### 補足: git grep

ワークツリー内の検索をします。
`.gitignore` に登録してあるファイルは除外されるので便利です。

```shell-session
$ git grep -np 検索したいワード
```

`-n` 検索に一致した行数を表示
`-p` 検索に一致した行の前にある関数名を表示

[git grep を使う](https://proc-cpuinfo.fixstars.com/2017/10/git-grep/)

### 補足: git blame

```shell-session
$ git blame ファイル名
```

リポジトリで管理されているファイル内の行ごとの最終更新を見れます。
行ごとのコミット(ハッシュ値)、コミッター、更新日が分かるよ。
問題が起きたとき等でどのコミットで変更されたかを探すなどするときに便利です。(犯人探しには絶対に使わないでください。大体犯人は自分です)

- https://lgtmoon.herokuapp.com
- http://hackason-lgtm-front.s3-website-ap-northeast-1.amazonaws.com/

この辺りのサイトからレビュイーの趣味趣向合いそうな最高のLGTM画像を探します。
一番時間を使うところです。ここは全力で探しましょう。

### 補足: 結局のところ...

GitHubの差分表示が優秀すぎるのでコマンド打つ必要ないのかも🤔

## 8. 再び自分のブランチに戻る

```shell-session
$ git switch -
```

ブランチ名を指定してもいいですが入力するのも思い出すのも面倒です。
`-` で一つ前のブランチに戻れます。

## 9. 退避しておいたコードを元に戻す

```shell-session
$ git stash pop
```

最新のスタッシュから退避させておいたコードを戻します。
いい感じのコードを書けたらコミットしてプッシュします。

## 10. コミットしてプッシュする

```shell-session
$ git add
$ git commit
$ git push -u origin HEAD
```

レビューする時は大体この流れでやってます。

## Git関連の記事まとめ

- [Git関連の記事一覧](https://qiita.com/search?q=user%3Aucan-lab+tag%3AGit&sort=created)

## 参考記事

- [サル先生のGit入門](https://backlog.com/ja/git-tutorial/)