作業は今 深い闇に おおわれた おーまいがー

技術

何って…作業やり直すのに git reset --hard HEAD^ しただけだが?

作業場に激震走る

今日作業中に git pull せずに git commit してしまい、「マージするのもキモいしいっぺん元に戻してコミットし直すか〜」と思って手癖で git reset --hard HEAD^ したら作業内容全部吹っ飛びました。

すでにコミット済の変更は git reflog -n 10 とかでコミットID探してresetし直すだけでいいため、焦ることはありません。 ただ、ステージに載せてないファイルは虚無に吸い込まれます。ぼくはいくつか作業をしてからまとめてコミットする癖があり、アンステージなファイルがいっぱいあったため、それらはすべて闇に呑まれ、衝撃のあまり10秒くらい停止し、今こんな記事を書いているのです。

2020-04-25-reflog.png

これはそのときの reflog です。クソ焦っててワロタ

うさぎがは せいかをけして しんでしまった

さよならさよならさよならさよなら…

どうすべきだったのか

この状況の問題を洗い出してみましょう。

  • git reset --soft HEAD^ と間違えた
  • アンステージなファイルが多かった
    • コミットログがかさむのも、ブランチ切ってSquash Mergeするのも嫌がってコミットをしていなかったため

まず1点目、alias grs "git reset --soft" しました。 これを普段から使うようにすれば、たとえ grs が暴発したとしても、アンステージなファイルは消えません。 故意にコマンドを打たないと --hard を使えないので、--hard の暴発回数も減るでしょう。

あるいは git reset --keep するのもいいでしょう。 これならアンステージなファイルを葬ることなく特定コミットを消すことができます。

次に2点目、作業時はいつでもブランチを切ることにしました。めんどくさくてもしようね。 すっきりした作業履歴を作るのは切ったブランチを git merge --squash するなり、git rebase でSquashするなりしてからで遅くありません。

gitは変更点を可読性・可用性の高い単位で扱え、それらを管理するに十分な機能を備えています。 少なくともコミットせずにエディタのUndo/Redoくらいでしか作業履歴管理できないより10000000000倍マシです。 それなのに変更点を全部頭の中で管理して後からコミットするのマジでgitの本質理解できてないからいっぺん死んだ方がいいよ。いや、すでに死んでたわ……

で、どうすんのよ

な。

どうしてくれんのこれ(憤怒)