個人的「便利だな」と思ったGitコマンド4選

存在を知った時や使ってみた時に「これけっこう便利だな」と思ったGitコマンド4つをまとめました。

# `git fetch -p`

`-p`を付けることで、削除されたリモートブランチのリモート追跡参照が削除されるようになります。
例えばリモートリポジトリで`branchA`が削除されると、`git fetch -p`によりローカルリポジトリ上の`origin/branchA`が削除されます。

※ `git fetch --prune`も同様です
※ `git pull -p/--prune`でプルする際に行われるフェッチにも適用できます

# `git log --oneline`

コミットハッシュが短縮され、コミットログが1行で表示されるようになります。

※ `git log --abbrev-commit --pretty=oneline`も同様です

表示例: `git log`の場合
```text
commit cmhash2commithash2commithash2commithash2 (HEAD -> master, origin/master, origin/HEAD)
Author: taro <taro@sample.jp>
Date:   Thu Sep 1 12:34:56 2022 +0900

    コミットB

commit cmhash1commithash1commithash1commithash1 (tag: v1.2.3)
Author: taro <taro@sample.jp>
Date:   Wed Aug 31 11:22:33 2022 +0900

    コミットA
```

表示例: `git log --oneline`の場合

```text
cmhash2 (HEAD -> master, origin/master, origin/HEAD) コミットB
cmhash1 (tag: v1.2.3) コミットA
```

# `git status -s`

`git status`の結果が短い形式で表示されるようになります。

※ `git status --short`も同様です

表示例: `git status`の場合

```text
On branch branchA
Your branch is ahead of 'origin/branchA' by N commits.
  (use "git push" to publish your local commits)

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
    modified:   modified_file_both.md
    modified:   modified_file_staged.md
    new file:   new_file_staged.md
    renamed:    rename_target.md -> renamed_staged.md

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    deleted:    deleted_file_unstaged.md
    modified:   modified_file_both.md

Untracked files:
  (use "git add <file>..." to include in what will be committed)
    untracked_file.md
```

表示例: `git status -s`の場合

```text
 D deleted_file_unstaged.md
MM modified_file_both.md
M  modified_file_staged.md
A  new_file_staged.md
R  rename_target.md -> renamed_staged.md
?? untracked_file.md
```

また`git status -sb`とすると、`git status -s`の表示にブランチとその追跡情報が加わります。

```text
## branchA...origin/branchA
 D deleted_file_unstaged.md
MM modified_file_both.md
M  modified_file_staged.md
A  new_file_staged.md
R  rename_target.md -> renamed_staged.md
?? untracked_file.md
```

ショートフォーマットの時に各ファイル名の左側に表示される記号の詳しい説明については[こちら](https://tracpath.com/docs/git-status/#i-6)を参照してください。

# `git branch -v/-vv`

ローカルブランチ名の一覧とともに

- 先頭コミットのハッシュ値
- 上流ブランチ名(`-vv`の場合のみ)とその関係性
- 先頭コミットのメッセージ

が表示されるようになります。

※ `git branch —v`は`git branch -—verbose`と同様です

表示例: `git branch -v`

```text
  branchA cmhasha ファイル追加
  branchB cmhashb ファイル編集
  branchC cmhashc [gone] ファイル削除
* master  cmhashm Merge pull request #XX from abc/develop
```

表示例: `git branch -vv`

```text
  branchA cmhasha [origin/branchA] ファイル追加
  branchB cmhashb ファイル編集
  branchC cmhashc [origin/branchC: gone] ファイル削除
* master  cmhashm [origin/master] Merge pull request #XX from abc/develop
```

※ 上流ブランチが削除されている場合「gone」と表示されます(例: branchC)

特に自身の開発現場では、プルリクエストをマージする際に「作業ブランチをリモートリポジトリから削除する」かつ「`Squash and merge`を用いることがある」ため、このコマンドは不要なローカルブランチの特定に役立っています。
(`git fetch -p`→)`git branch -v/-vv`の結果に含まれる「gone」という表記をもとに不要なローカルブランチを探しています。

※ `git branch --merged`の結果にはスカッシュマージされたブランチが含まれません

# 参考

- [Git コマンドリファレンス（日本語版）](https://tracpath.com/docs/)