細かくコミットしすぎて何の作業をしたのかがわからなくなることはありませんか？(コミットを集約，編集する，削除するgit rebase)


# 1．複数コミットを1つにまとめたい(squash)
## git rebaseで行う
PRを作成したブランチに移動する

```md:リモートブランチから取得する
git checkout origin feature/1234
```
または
```md:ローカルブランチ内で移動する
git switch feature/1234
```

リベースをする
```md:HEAD(現在の作業位置)からnこ分のコミット履歴を表示する
git rebase -i HEAD~n
```
するとテキストエディタとして以下のような文字が表示される
~~~md:n = 2として実行した結果
pick 0000000 commit A
pick 1111111 commit B

# Rebase 7a54171..32eea59 onto 7a54171 (2 commands)
（以下略）
~~~

まとめたいコミットを`pick`から`squash`と書き換える．
~~~md:squashに書き換える
pick 0000000 commit A
squash 1111111 commit B

# Rebase 7a54171..32eea59 onto 7a54171 (2 commands)
（以下略）
~~~
修正が完了したら，`Esc`を押し`:wq`を入力して保存して終了する．
その後，再度テキストエディタが開くので，
~~~
# This is a combination of 2 commits.
# This is the 1st commit message:

commit A comment

# This is the commit message #2:

commit B comment
（以下略）
~~~
まとめ先のコミットや消すコミットのメッセージを修正できる
~~~
# This is a combination of 2 commits.
# This is the 1st commit message:

commit A and B comment

# This is the commit message #2:

# commit B はいらないのでメッセージごと削除すれば良い
（以下略）
~~~

修正が完了したら，`Esc`を押し`:wq`を入力して保存して終了する．

:::note warn
まとめた際に，まとめる元のコミットは履歴に残らず，まとめる先のコミットのみ残るので注意
:::


その後，リモートにフォースプッシュする．
```
git push -f origin feature/1234
```

## git reset --softで行う
最新のコミットから見て直前のコミットを一気にまとめる際に有効．
PRを作成したブランチに移動する

```md:リモートブランチから取得する
git checkout origin feature/1234
```
または
```md:ローカルブランチ内で移動する
git switch feature/1234
```
リセットをする．
これはワーキングエリアやステージングエリアの内容を保持したままHEADを戻すことができる．
```md:HEAD(現在の作業位置)からnこ前のコミットにHEADを戻す．
git reset --soft HEAD~n
```
>`HEAD~n`の部分は`git log`によって出てくるコミットハッシュを指定しても良い．指定した場合，HEADから指定したコミットまでコミットをまとめることができる

これでnこ分の変更内容が`git add`された状態になる．
この後commitをする．
```
git commit -m "Commit message"
```
これでnこ分の変更内容が`git commit`された状態になった．

:::note info
一個前のコミットに追加でファイルをコミットしたい際には以下のコマンドを実行する
```md:sample.txtを追加する
git add sample.txt
git commit --amend -m "Update Commit message"
```
>`git commit --amend -m "Update Commit message"`のみ実行すればコメントのみ変更できる
:::

その後，リモートにフォースプッシュする．
```
git push -f origin feature/1234
```
その他のresetコマンドについてはこの記事で 

https://qiita.com/tarakokko3233/items/38de3bf197fc2a262d4b

# コミットを編集したい
PRを作成したブランチに移動する

```md:リモートブランチから取得する
git checkout origin feature/1234
```
または
```md:ローカルブランチ内で移動する
git switch feature/1234
```

リベースをする
```md:HEAD(現在の作業位置)からnこ分のコミット履歴を表示する
git rebase -i HEAD~n
```
編集したいコミットを`pick`から`edit`と書き換える．
~~~md:squashに書き換える
pick 0000000 commit A
edit 1111111 commit B

# Rebase 7a54171..32eea59 onto 7a54171 (2 commands)
（以下略）
~~~
書き換えが完了したら，`Esc`を押し`:wq`を入力して保存して終了する．

これでHEADがeditと指定したコミットに移るのでコミット内容を編集する．
### ファイルを追加したい
```md:sample.txtを追加する
git add sample.txt
git commit --amend -m "Update Commit message"
```

### ファイルを削除したい
ステージングエリアからのみ削除してワーキングエリアには残しておきたい場合
>つまり後でコミットし直したい時に使う

```md:sample.txtをステージングエリアから削除する
git rm --cached sample.txt
git commit --amend -m "Update Commit message"
```
ステージングエリアだけでなくワーキングエリアからも削除したい場合
```md:sample.txtをステージングエリアとワーキングエリアから削除する
git rm sample.txt
git commit --amend -m "Update Commit message"
```

### コミットメッセージを変更したい
`git commit --amend`のみ実行する
```md:コミットメッセージを更新する
git commit --amend -m "Update Commit message"
```
***


編集が終了したら次の`edit`を指定したコミットまで移動させるために下記のコマンドを実行する．移動したら上記のコミット編集操作を行い下記のコマンドを実行する動作を繰り返す．

:::note info
もし1つだけ`edit`にしていたらリベースが終了するので以下のコマンドを実行した後に次のフォースプッシュをすること
:::
```
git rebase --continue
```
最後にリモートへフォースプッシュする．
```
git push -f origin feature/1234
```

# コミットの削除をしたい
:::note warn
コミットを削除することで，エラーが発生したり，コミット履歴が壊れたりする可能性がある．特に，削除されたコミットに依存する他のコミットがある場合，コンフリクトが発生したり，変更差分が正しく追跡できなくなったりすることがあるので注意．
:::

PRを作成したブランチに移動する

```md:リモートブランチから取得する
git checkout origin feature/1234
```
または
```md:ローカルブランチ内で移動する
git switch feature/1234
```

リベースをする
```md:HEAD(現在の作業位置)からnこ分のコミット履歴を表示する
git rebase -i HEAD~n
```
するとテキストエディタとして以下のような文字が表示される
~~~md:n = 2として実行した結果
pick 0000000 commit A
pick 1111111 commit B

# Rebase 7a54171..32eea59 onto 7a54171 (2 commands)
（以下略）
~~~

削除したいコミットを`pick`から`drop`と書き換える．
~~~md:dropに書き換える
pick 0000000 commit A
drop 1111111 commit B

# Rebase 7a54171..32eea59 onto 7a54171 (2 commands)
（以下略）
~~~
修正が完了したら，`Esc`を押し`:wq`を入力して保存して終了する．
その後，再度テキストエディタが開くので，
~~~
# This is a combination of 2 commits.
# This is the 1st commit message:

commit A comment

# This is the commit message #2:

commit B comment
（以下略）
~~~
消すコミットのメッセージを修正できるがコミットを削除するのでコメントは消してしまってよい
~~~
# This is a combination of 2 commits.
# This is the 1st commit message:

commit A and B comment

# This is the commit message #2:

# commit B はいらないのでメッセージごと削除すれば良い
（以下略）
~~~

修正が完了したら，`Esc`を押し`:wq`を入力して保存して終了する．

コンフリクトを直してadd commitをする
```
git add <file>
git commit -m "コメント"
```


必要に応じてリベースを継続する
```
git rebase --continue
```

その後，リモートにフォースプッシュする．
```
git push -f origin feature/1234
```