LoginSignup
5
3

はじめに

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前の状態も表示、と使い分けることが可能です。

.gitconfig
[alias]
    logg = log --graph --oneline --decorate --all
    loga = "!f() { git logg $(git rev-list --reflog) $@; }; f"
  1. 元の状態をremoteにpush済みであれば表示されますが、rebase後にforce pushするとやはり表示されなくなります。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3