git rebase はとても便利だが失敗は致命的2019年01月18日 22時00分13秒

git は rebase コマンドで、コミット済みの変更をさらに修正することができる。git rebase -i HEAD~10 等として、HEAD から幾つ分修正するかを指定するのが、大抵の使い方。

こうすると対話的な動作が始まって、指定された履歴が表示され、各々をどう扱うか聞いてくる。主に squash で複数のコミットを統合したり、reword で、コミットログを編集したりするのが、個人的には良く使うコマンド。

なぜ、履歴を編集するのかというと、セーブポイントの保持の為。普段からそれこそ細かいコードの修正や誤字や脱字の修正事にでも、コミットしている。それこそ、不慮の事故に備えて細かくコンパイルする毎にコミットうをしているくらいだ。マージをする前に細かな差分を全て統合して、他の人の査読用にまとめる。

実は、今回 rebase 中に間違いを犯してしまった。vi エディタで、esc が反応しなかったらしく、その後の打ち込みが、意図しない入力に。git commit や git rebase では、コミットログや履歴の変更を何も打ち込まないと、取り消しになる。

# If you remove a line here THAT COMMIT WILL BE LOST.
#
#       However, if you remove everything, the rebase will be aborted.
編集中のコミット ID までおかしくなったので、履歴を全て消して vi を終了したら、rebase 中のコミットが全て消えてしまった。

流石に、rebase が失敗した時は、焦った。幸い今回消えたのは、10 個だけ。この細かいコミット作法の所為もあって、実質的に消えた部分は二個分の機能変更。八割は起動中のエディタから強制上書きで復帰できた。若干失われた変更は、screen の跡やログから完全復帰。

少々 git rebase において軽率だった。rebase 直前に、tar でも git clone/push での簡単なバックアップを取る習慣をつけた方がよさそうだ。