よく使う、または忘れがちな Git Commandまとめ

# はじめに

よく使う便利なコマンドや、いざ使おうと思った時、忘れてしまっていることがあるコマンドをまとめてみました。

## 1つ前にコミットした差分

```sh
git log -p -1
```

## 1つ前にコミットしたファイル一覧を表示

```sh
git log --stat -1
```

## 1つ前のコミットをなかったことにする

```sh
git reset --hard HEAD^
```

## ワークディレクトリの内容はそのままで1つ前のコミットをなかったことにする

```sh
git reset --soft HEAD^
```

## 1つ前のコミットメッセージを修正

```sh
git commit --amend
```

## 1つ前のコミットユーザを修正したい

```sh
git commit --amend --author="user_name <user_email@example.com>"
```

## 1つ前のコミットした時間を今の時間に修正したい

```sh
git commit --amend --date "`date -R`"
```

## コミット済みの2以上のコミットを1つのコミットにまとめる

例）`aaa.txt` ファイルを編集しコミットしたが、漏れがあり、追加編集したコミットを1つにまとめたい

```sh
git rebase -i HEAD~~
```

まとめたいコミットのコマンドを `pick` から `s` または `squash` に変更し保存(`:wq` 等)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/304414/d4bac453-83ee-7404-9e37-33f91b1ddf90.png)

コミットメッセージを修正する画面が表示される

![image.png](https://qiita-image-store.s3.amazonaws.com/0/304414/560e7407-e55a-2c42-09d6-0b54dcc0f059.png)

コミットメッセージを修正し保存(`:wq` 等)

## 追加の変更を最新のコミットに追加する

変更内容をAddしておく

```sh
git add -A
```

最新のコミットのメッセージのまま追加の変更を最新のコミットに反映

```sh
git commit --amend --no-edit
```

## 空でcommitする

```sh
git commit --allow-empty -m "メッセージ"
```

## 一番最初のコミットを2つ目のコミットとまとめる

```sh
git rebase -i --root
```

## 派生元のブランチを変更する

```sh
git rebase --onto [変更先ブランチ名] [変更前ブランチ名] [対象のブランチ名]
```

## 派生元のブランチを更新する場合

```sh
git pull --rebase origin [派生元のブランチ名]
```

## リモートのブランチにローカルのブランチを強制一致させる

```sh
git reset --hard origin/[ブランチ名]
```

## ブランチの切り替え

```sh
git checkout [切り替えたいブランチ名]
```

## ブランチの作成

```sh
git checkout -b [作成したいブランチ名]
```

この時、派生元にするブランチに切り替えておく

## ブランチの削除

current branchが削除対象のブランチの場合、以下のエラーが発生し、削除できないので、別のブランチに `checkout` しておく

```
error: Cannot delete the branch 'test' which you are currently on.
```

### マージ済みのブランチを削除

```sh
git branch --delete [削除したいブランチ名]
```

マージしていないブランチを削除する場合、以下のエラーが出て、マージされていないとお知らせしてくれる

```
error: The branch 'test' is not fully merged.
If you are sure you want to delete it, run 'git branch -D test'.
```

### マージしたかどうかを問わずブランチを削除

```sh
git branch -D [削除したいブランチ名]
```

### マージ済みのブランチを一括削除

```sh
git branch --merged|egrep -v '\*|develop|master|main'|xargs git branch -d
```

※`develop`、`master`、`main`は消さないようにしています。

## 1つ前の作業ブランチに切り替える

```sh
git checkout -
```

## 指定ファイルを1つ前のコミット時の状態に戻す

```sh
git checkout HEAD~ [指定ファイル]
```

## 特定のファイルのみコミットを取り消す（変更する）

```sh
git checkout [コミットID] -- [変更したいファイル or フォルダ]
```

## Gitの設定を変更

### ユーザ名の設定(local)

```sh
git config --local user.name [ユーザ名]
```

### メールアドレスの設定(local)

```sh
git config --local user.email [メールアドレス]
```

### 設定の確認

```sh
git config --list
```

## 特定のコミットのみを反映させる

```sh
git cherry-pick [コミットID]
```

## 特定のコミットを指定のブランチにpush

```sh
git push origin [コミットID]:[pushしたいブランチ名]
```

## revert

基本的にGitHubのマージ済みPR画面で`revert`ボタンがあるので、そこからできるが、ベースブランチではない集約PR等にマージした場合、後々、ベースブランチに対して`revert`ができないので、手動で`revert`する用

### revertコミットをする方法

```sh
git revert [コミットID]
```

### revertコミットをしない方法

複数revertしたいコミットがあり、全部revertした後、1つのコミットにしたい場合等に利用

```sh
git revert [コミットID] -n
```

## ファイル名の大文字・小文字の変更を検知

### 設定の確認

```sh
git config -l --local | grep core.ignorecase
```

```sh:検知しない
core.ignorecase=true
```

```sh:検知する
core.ignorecase=false
```

### 設定の更新

```sh:例）検知するに更新
git config core.ignorecase false
```

## タグのコミットハッシュ取得

```sh
git show-ref -s [タグ名]
```

# 最後に

筆者は特に `commit --amend --author` と `rebase --onto` の書き方を忘れます。
筆者は大量にコンフリクトした時等の考えることを放棄した瞬間、呪文のように `git status` を唱えています。