はじめに
Gitでrebaseやamendなどを使用して歴史改変を行うと、改変前のコミットはどこからも参照されないコミット(dangling commit)となり、logに表示されなくなります。
(元々複数のブランチから参照されていた場合や、タグを付けていた場合などを除く)
改変前の状態を後から確認したくなった場合などに、そのようなコミットをlogに表示する方法を紹介します。
方法
初めにこのような状態があり、
$ git log --graph --oneline --decorate --all
* d670ab8 (master) F
* 3919af1 E
* be56851 D
| * 00ed0c4 (HEAD -> hoge) I
| * 47f1706 H
| * e3af59b G
|/
* 30d63a9 C
* fa7b8c4 B
* 06d8040 A
* b4826a9 Initial commit
hoge
ブランチをmaster
ブランチにrebaseしました。
$ git rebase master
Successfully rebased and updated refs/heads/hoge.
この時、普通にグラフを表示すると以下のようになり、rebase前の状態は見えなくなっています。1
$ git log --graph --oneline --decorate --all
* a5a6587 (HEAD -> hoge) I
* f7db3f4 H
* ef48479 G
* d670ab8 (master) F
* 3919af1 E
* be56851 D
* 30d63a9 C
* fa7b8c4 B
* 06d8040 A
* b4826a9 Initial commit
しかし、「rebase時のコンフリクト解消で何かミスったかも…?」など、後から元の状態を見たい場合もあるかと思います。
そのような場合、以下のようにすると、見えなくなった元のコミットも表示されます。
Bashの記法(`
)を使用するため、Windowsの場合はGit Bash上で実行する必要があります。
$ git log --graph --oneline --decorate `git rev-list --reflog`
* a5a6587 (HEAD -> hoge) I
* f7db3f4 H
* ef48479 G
* d670ab8 (master) F
* 3919af1 E
* be56851 D
| * 00ed0c4 I
| * 47f1706 H
| * e3af59b G
|/
* 30d63a9 C
* fa7b8c4 B
* 06d8040 A
* b4826a9 Initial commit
元のhoge
ブランチの先頭コミットである00ed0c4
をcheckoutすれば、rebase前の状態を復元できます。
$ git checkout 00ed0c4
おまけ
上記のコマンドはまれによく使うため、エイリアスを設定しておくと便利です。
.gitconfig
に以下の内容を記載しておくと、普段はgit logg
で通常のグラフを表示、
必要に応じてgit loga
でrebase前の状態も表示、と使い分けることが可能です。
[alias]
logg = log --graph --oneline --decorate --all
loga = "!f() { git logg $(git rev-list --reflog) $@; }; f"
-
元の状態をremoteにpush済みであれば表示されますが、rebase後にforce pushするとやはり表示されなくなります。 ↩