git reset --hard HEAD を安全にした

昨日、git reset --hard HEAD してしまって大変なことになった話を書いた。私は普段これを cancel と言う名前に alias して使っている。

[alias]
  # 中略
  cancel = reset --hard HEAD

しかし前回のようなことがまたあってはたまらない。人間はミスするものだ。
alias があって実行しやすいのが問題なのだろうか? いや、割とよくする操作*1だし、alias しなくても使うだろう。
てことで、cancel が安全になるようにしてみた。

[alias]
  # 中略
  cancel = !git commit -a -m 'Temporary commit for cancel' && git reset --hard HEAD~

一旦コミットしてからそのコミットを消す。こうしておけば最悪 git reflog から元に戻せる。特にコミットするものがない場合は commit が失敗するので reset は実行されないので安全。これでまた1つ便利になった。
ところで、Git の alias でこれみたいに複数コマンドを実行させたい場合ってよくあるんだけど、! を使うとシェル経由になるから Windows での挙動が心配になる。標準で alias で複数コマンド実行できるようにならないもんかなー。

*1:git stash pop → CONFLICT! とりあえず今のなし!とか