三行で
- まちがえて
rebaseした - 戻した
- いちやさGit第3版でるよ
背景
GUIのGitクライアントを使用していると意図せず rebase されてしまう場合があります。
pull した時にリモート追跡ブランチで更新があった場合などで、ダイアログがでるものの聞いてくるのは「 rebase する?」だったりして、一般的には推奨されてるんだろうなとは思うものの趣味には合いません。
油断してるとうっかりOKを押しちゃったり、その選択を維持するチェックをうっかり入れちゃったり。あるあるです。
こういううっかりが「あるある」なのはGitの操作(特にローカルに関する)に対する注意力を捨てているからです。
リモートを更新する push などはある程度気をつけますが、Gitのローカルに関して私の通常の操作で復旧できなくすることはまずありません。取り返しのつくところには注意力というリソースを割かないようにしています。
「 rebase してもいいじゃん」と言えばそれまでなんですが、私は rebase せずにありのまま記録する方が好みです。
先に趣味に合わないとか好みとか書いている通り、コードの共同所有者などのコンテキストにこだわりやルールがあればそれに合わせます。
ちなみにそのまま記録したものを整形することはいくらでもできますが、改変したものを事実に戻すのは不可能になることもしばしばです。不可逆な決定はせずに済むならしないに越したことはありません。あといみゅーたぶる推し。
しない方が好みとか書いていますが、 rebase が好きな時期もありました。たとえば gitのrebaseとremoteとbranchと - 日々常々 とか。近年はしない方が好みですが、来年には好きになっているかもしれません。
私はGitの操作はCUIが好みではあるのですが、IntelliJ IDEAではショートカット一発でCommit&Pushできるので利便性からGUIを使うことが多いです。 AIにコミットメッセージ書いてもらうのも便利ですしね。
あ、Gitといえば「いちやさGit(いちばんやさしいGit&GitHubの教本)」の第3版が1/23に出るそうです。来週ですね。
第3版は確認していませんが、初心者向けの顔をしてるのにCUIで説明する本です。GUIだと理解してほしいことが裏に隠れがちなので初心者向けだからこそCUIってのもあるんですけど、レビュアー含めてCUI派だったからってのも往々にしてあるんじゃないかなぁって思います。
やったこと
git rebase -i {どっかいい感じのコミット} でインタラクティブにして、混入したコミットを除去するなども考えられますが、これは本来のコミットを復元するわけではなく再現するものになります。
ほぼ問題なく再現されるのでコードや各コミットのタイムスタンプ、差分は同じだけど、コミットハッシュは変わるし、趣味に合わないです。
なので落ち着いて git reflog です。

rebase (start) とか書いてるのが rebase の基点となるコミット。なのでここでは 4ae20327c が rebase される前の最終コミットです。
つまりここに reset してやれば戻ります。 git reset --hard 4ae20327c でうっかりが無かったことになります。(って書いて「これはこれで歴史改変じゃん」とおもったのでダブスタっぽいけど気にしない。)
※ちなみに reflog つかわずともGUIクライアントのログには最後にコミットした時のコミットハッシュが記録されていたりもしますので、そっち見て rebase してもいいと思います。GUIクライアント使っててログを見る人ってそんないないと思うけど。
ということで
かんたんにうっかりが取り戻せたので、今後もローカルGit操作に注意力リソースを割かずにいられそうです。こうして人はどんどん鈍感になってゆく。
reflog は先の本などには(たぶん)載っていませんが、ローカルで「やっちゃったー」なときには手っ取り早く汎用的に使えて便利です。余計な操作する前でないと埋もれちゃったりするので状況次第ですが、トラブってる人の状況を見る時とかにも使えるとたまに役に立ちます。最近はGit慣れてきている人が増えてきているせいなのか、GUIツールの出来が良くなってるのか、リモートで問題に気づく機会が減っているからか、トラブルを一緒に見る機会は減った気がするけど。
