git reflog がすごい

# git reflog

reflogは、gitで行った操作の履歴をみることができます。
さらに、resetを使用して、gitの操作を操作することができます。

## gitの操作とは、どういう意味か
例えば、
* git revert
git revertは、特定のコミットを打ち消すコミットを新しく作成するコマンド。
PRなどをマージ後に取り消したいときに使うお馴染みの操作。
`git revert {commit id}`

* git reset --head HEAD^
コミットを取り消すコマンド。
pushする前であれば、間違えてしまったコミットをやり直したり、取り消したりすることができる操作。
`git reset --head HEAD^`

上記のコマンドは、コミットに対して操作しています。


git reflogでは操作のログを確認することができます。
```
% git reflog
e821293 (HEAD -> master) HEAD@{0}: revert: Revert "Merge commit 'edc11a9e0fcfefe8f2a25b6c48eb383a0bca07dc' into feature/test2"
bdeff3a (feature/test2) HEAD@{1}: merge feature/test2: Fast-forward
edc11a9 (feature/test4, feature/test3) HEAD@{2}: checkout: moving from feature/test4 to master
edc11a9 (feature/test4, feature/test3) HEAD@{3}: checkout: moving from master to feature/test4
edc11a9 (feature/test4, feature/test3) HEAD@{4}: checkout: moving from feature/test3 to master
edc11a9 (feature/test4, feature/test3) HEAD@{5}: checkout: moving from master to feature/test3
edc11a9 (feature/test4, feature/test3) HEAD@{6}: checkout: moving from feature/test2 to master
bdeff3a (feature/test2) HEAD@{7}: merge edc11a9e0fcfefe8f2a25b6c48eb383a0bca07dc: Merge made by the 'recursive' strategy.
ad76b54 HEAD@{8}: checkout: moving from master to feature/test2
edc11a9 (feature/test4, feature/test3) HEAD@{9}: commit: add test
d567f03 HEAD@{10}: checkout: moving from feature/test2 to master
```
`revert`・`merge`・`checkout`・`commit`など、リポジトリ内でgit操作した履歴が表示されています。

## gitの操作の操作をする
先ほどの`git reflog`で表示された履歴から、`git reset --hard HEAD@{n}`でそれよりあとに行った操作を取り消すことができます。

上の例で、「`feature/test2`ブランチを`master`にFast-forwardでマージした」部分まで、操作を戻したいとします。

`git reset --hard HEAD@{1}`を実行すると、
```
% git reflog               
bdeff3a (HEAD -> master, feature/test2) HEAD@{0}: reset: moving to HEAD@{1}
e821293 HEAD@{1}: revert: Revert "Merge commit 'edc11a9e0fcfefe8f2a25b6c48eb383a0bca07dc' into feature/test2"
bdeff3a (HEAD -> master, feature/test2) HEAD@{2}: merge feature/test2: Fast-forward
edc11a9 (feature/test4, feature/test3) HEAD@{3}: checkout: moving from feature/test4 to master
edc11a9 (feature/test4, feature/test3) HEAD@{4}: checkout: moving from master to feature/test4
edc11a9 (feature/test4, feature/test3) HEAD@{5}: checkout: moving from feature/test3 to master
edc11a9 (feature/test4, feature/test3) HEAD@{6}: checkout: moving from master to feature/test3
edc11a9 (feature/test4, feature/test3) HEAD@{7}: checkout: moving from feature/test2 to master
bdeff3a (HEAD -> master, feature/test2) HEAD@{8}: merge edc11a9e0fcfefe8f2a25b6c48eb383a0bca07dc: Merge made by the 'recursive' strategy.
ad76b54 HEAD@{9}: checkout: moving from master to feature/test2
edc11a9 (feature/test4, feature/test3) HEAD@{10}: commit: add test
```
直前（`HEAD@{0}`）にあった、「`revert: Revert "Merge commit 'edc11a9e0fcfefe8f2a25b6c48eb383a0bca07dc' into feature/test2"`」のマージコミットをリバートした操作が取り消されていることがわかります。

```
 % git log
commit bdeff3acf061a8d7793c5f5ad95e3f7e39bf1d86 (HEAD -> master, feature/test2)
Merge: ad76b54 edc11a9
Author: bebeken <xxx>
Date:   Sat Sep 11 16:09:24 2021 +0900

    Merge commit 'edc11a9e0fcfefe8f2a25b6c48eb383a0bca07dc' into feature/test2

commit edc11a9e0fcfefe8f2a25b6c48eb383a0bca07dc (feature/test4, feature/test3)
Author: bebeken <xxx>
Date:   Sat Sep 11 16:08:45 2021 +0900

    add test


```

また、`git log`でも、リバートのコミットが消えていることがわかります。

## 私の場合・・・
今回の操作だと、ひとつ前の操作を取り消しただけでしたが、もっと盛大にやらかした場合は便利だと思います。
私の場合は、master/親ブランチ/作業ブランチのマージ順番をローカルで誤って、めちゃくちゃにしてしまったのでそれらの操作を丸々取り消したということで、`git reflog`に感動しました。

gitの基本コマンドは歴史を作っていくイメージですが、`git reflog`はもっと上の歴史を操作する神コマンドと感じました。

ちなみに、`git log -g`でも、reflogが見れるみたいでした。
```
% git log -g
commit bdeff3acf061a8d7793c5f5ad95e3f7e39bf1d86 (HEAD -> master, feature/test2)
Reflog: HEAD@{0} (bebeken <xxx>)
Reflog message: reset: moving to HEAD@{1}
Merge: ad76b54 edc11a9
Author: bebeken <xxx>
Date:   Sat Sep 11 16:09:24 2021 +0900

    Merge commit 'edc11a9e0fcfefe8f2a25b6c48eb383a0bca07dc' into feature/test2

commit e82129307f7db21eb9eccf5dc89fe3acd9a3366f
Reflog: HEAD@{1} (bebeken <xxx>)
Reflog message: revert: Revert "Merge commit 'edc11a9e0fcfefe8f2a25b6c48eb383a0bca07dc' into feature/test2"
Author: bebeken <xxx>
Date:   Sun Mar 19 20:17:15 2023 +0900

    Revert "Merge commit 'edc11a9e0fcfefe8f2a25b6c48eb383a0bca07dc' into feature/test2"
    
    This reverts commit bdeff3acf061a8d7793c5f5ad95e3f7e39bf1d86, reversing
    changes made to ad76b54e8c26013e18fd9ed891285829b44a92f6.
```