個人開発でよく使う破壊的Gitコマンド

# よく使うGitコマンド

## git commit

### 直前コミットのやり直し

```git commit --amend```

このコマンドを使うとコミットメッセージの編集画面がviなどで開くものの、行頭でシャープ記号など使うとコメントアウト扱いになって認識されず、個人的には使い勝手が悪いためよく使用するのは以下のパターン。

```bash:直前コミットのやり直し（コミットメッセージも同時に編集）
git commit --amend -m "#1234 修正1＋修正2"
```

## git reset

### 直前コミットの取り消し

```git reset <option> HEAD~```

または

```git reset <option> HEAD^```

```bash:直前のコミットをキャンセル（作業内容維持）
git reset --soft HEAD~
```

```bash:直前のコミットをキャンセル（作業内容破棄）
git reset --hard HEAD~
```

```--soft```：作業内容はそのまま維持してコミットだけ取り消し。

```--hard```：コミットを取り消した上で作業内容もリセット。

:::note warn
~ (チルダ) は『n世代前のコミットを指定』の意味。
^ (キャレット) は『複数の親コミットからコミットを指定』の意味。

そのため『nコミット前』を意図するなら ~ (チルダ) に癖付けするのが吉。
（@gyokuto さん、ご指摘ありがとうございました！）
:::

reset系は基本的にコミットログもろとも抹消されるので、チーム開発ですでにプッシュした後のブランチを対象にする場合は注意。（特別な理由がなければしない方がいい）

なおWindowsの場合は ```git reset --soft "HEAD~"``` のように、 ```HEAD~``` を ```"``` で囲むらしい。

## git push
### 強制プッシュ

```git push -f <remote> <branch>```

```bash:強制的にプッシュする
git push -f origin branchName
```

前述の ```git commit --amend``` や ```git reset``` などで歴史改竄したコミットを強制的にリモートへプッシュするときなどによく使用する。

## ブランチ削除

### Gitブランチを削除する (ローカル＆リモート)

- ローカル：```git branch -d <branch>```
- リモート：```git push <remote> --delete <branch>```

今いるブランチは削除できないので、他のブランチにチェックアウト（移動）した後に実施。

```bash:ローカルのブランチを削除
git branch -d branchName
```

```bash:リモートのブランチを削除
git push origin --delete branchName
```

プッシュやマージされていないローカルブランチはオプション ```-d``` で削除できないため、オプション ```-D``` を使用。

```bash:ローカルのブランチを強制削除
git branch -D branchName
```

## git revert
### コミットを戻す（"戻した"という履歴を残しながら戻す）
別な表現で書くと、「取り消したいコミットを打ち消すような、コミットを新たに作る」。

```git revert <commit>```

「IDで指定したコミットを打ち消す」コミットが新しく追加されるため、元のコミットは維持され完全な歴史改竄とまではならない。

自分がよく使うのは以下。

### マージしたコミットを戻す

```bash:マージしたコミットを戻す
git revert -m 1 <commit>
```

マージコミットを取り消す場合は、親コミットのどちらに戻すか数字で指定する。

git log コマンドなどで、マージコミットがどのコミットとどのコミットから生まれたかがわかるので、それを踏まえて1か2を指定。
（以下の例だと、コミットID ```1231231``` に戻したい場合は ```1``` 、```4564564``` に戻したい場合は ```2``` 。）

```bash:git log
commit xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (origin/feature/123456)
Merge: 1231231 4564564
Author: user.name <user.name@example.com>
Date:   Thu Jun 1 09:40:36 2025 +0900

    Merge remote-tracking branch 'origin/feature/456' into feature/123456

commit 4564564ee98f19316eb4d7eacd29a8ab9ccac1dd (origin/feature/456, feature/456)
Author: user.name <user.name@example.com>
Date:   Thu Jun 1 06:36:49 2025 +0000

    Add new file 456.txt

commit 1231231e4050b45b4010588c82e3ef3ba62a7efc (origin/feature/123, feature/123)
Author: user.name <user.name@example.com>
Date:   Thu Jun 1 05:32:23 2025 +0900

    Add new file 123.txt

commit 000000068f6eec77976b890f022591f4c8b760de (origin/main, origin/HEAD, main)
Author: user.name <user.name@example.com>
Date:   Wed Jun 1 02:16:10 2025 +0000

    Initial commit
```


## git fetch
### ブランチ一覧を同期

```bash:ブランチ一覧を同期
git fetch -p
```

オプション ```-p``` は "prune" (取り除く) の意味。リモートに存在しないブランチはローカルからも削除される。

#### 参考URL
[git Book](https://git-scm.com/book/ja/v2)
[git Reference | git reset](https://git-scm.com/docs/git-reset)
[Git ブランチを削除する方法 (ローカル、リモート)](https://www.freecodecamp.org/japanese/news/how-to-delete-a-git-branch-both-locally-and-remotely/)
[[Git]コミットの取り消し、打ち消し、上書き](https://qiita.com/shuntaro_tamura/items/06281261d893acf049ed)
[【Gitコマンド】コミットメッセージ変更方法](https://qiita.com/suga_slj/items/260e83d2ea6841227687)
[【やっとわかった！】gitのHEAD^とHEAD~の違い](https://qiita.com/chihiro/items/d551c14cb9764454e0b9)
[git reset の使い方と、主要オプション](https://www-creators.com/archives/1069)
[【gitコマンド】いまさらのrevert](https://qiita.com/chihiro/items/2fa827d0eac98109e7ee)