Gitの操作を間違えて半年分の努力が飛んでいった件
こんにちそらたか☀
まゆつな空高(Sky-High)です!
6月の初め、以下のようなツイートをしました。
おはそらたか☁️
— まゆつな空高🦾👹 計算機科学/工学系D進VTuber【Sky-High】 (@mayu27_sky_high) June 2, 2021
昨日約半年分のコードが消滅してしまったんですが、なんと無事復旧することができませんでした🤘
このダメージにより所長はお亡くなりになりました。詳細を後ほどnoteに書きたいと思います。
今後は私が所長の代わりに博士号を取れるよう頑張りたいと思います💪🙄#おはようVTuber
【超朗報】Git誤操作で半年分の努力がぶっ飛んだやつ、多分全部復活する https://t.co/xFHgd1c6mI
— まゆつな空高🦾👹 計算機科学/工学系D進VTuber【Sky-High】 (@mayu27_sky_high) June 9, 2021
この件について、一体何が起こったのか、なぜ大丈夫になったのか、所長はどうなったのか?
全てご説明したいと思います。
さよならは突然に
6月1日、夜のこと。
先月から寝付けなかったり、普段あまりしないミスをしたり、機器の誤動作で怒られる羽目になったりと良くないことが続いていました。
そんなこんなでなかなか作業に集中できない日が続いていたのですが、その日は比較的頑張って作業をしていて、夜中まで研究室にいました。
私はサーバーのコンソールとローカル(PC)のコンソールを両方開いており、それぞれで作業をしていたのですが、ある操作をした瞬間に手から肩にかけて緊張が走りました。
画面を見たとき、その緊張は寒気へと豹変し、パニックとなり、そして…
何があったのか
以上が所長から得られた当時の記憶です。
何をしたのか、それは以下のツイートが参考になるかと思います。
これは本当にあった怖いの話なんですが、うっかり
— まゆつな空高🦾👹 計算機科学/工学系D進VTuber【Sky-High】 (@mayu27_sky_high) June 1, 2021
$ git reset --hard HEAD^
すると未コミットでaddもしてない編集内容はもれなく爆散します💥
こまめにコミットしような😁
アンドもしやっちまったらローカル漁ったりや鯖缶にバックアップ救済頼んでお祈りしましょう🙏#空高の豆知識
Gitを知らないツイ廃の人にこの状況を説明すると、
「下書きで温めてた渾身のネタツイートを呟こうと思って開いたけど、やっぱ今度にしようと思って閉じたら消えちゃった」
みたいな感じです。
(ちなみにこの現象、割と最近までツイッターのWeb版かiOS版であったんだけど、この記事書いてる時点でやったら「保存か削除か」選択するようになって事故らないように修正されてます)
Gitというのは、バージョン管理システムと言って、プログラムやテキストファイルなどあらゆるファイルのその時点の内容を記録して、たとえ上書き保存したファイルでも記録したバージョンがあればいつでも戻すことができる、というプログラミングする全人類が使っているツールです(全員とは言っていない)。
ここで、2つの疑問が出てくると思います。
・なんで半年間も下書きのような状態(未コミットのまま)にしていたのか
・なんでデータが吹っ飛ぶような操作をしてしまったのか
まず、1つ目ですが、未完成だからこそ下書きするわけです。ネタとして洗礼されていないツイートを送信してしまうことなど、真のツイッター芸人なら到底許せないですよね???
ツイッターの場合と同じように、Gitもcommitしてしまうと記録として残ってしまうため、なるべくならデバッグコードだらけのプログラムじゃなくて、機能が出来上がったものをcommitしたいんです。なので、commit を保留して開発を続けていたんですが、かなり実装に時間がかかる部分だったのと、途中で別の作業の方をやらなくてはいけなくなり、しばらく手を付けていない期間がありました。半年commitしていないという状況の完成です。
2つ目ですが、この
git reset --hard コミットID
をすると、指定したバージョンまでの記録を無かったことにできます。
って書くとヤバいコマンドのように思えますが、大抵の場合、gitのリポジトリ(作業フォルダ)は複数の場所に保存されているはずなので、適切に管理していれば、一箇所こういうことをしてもデータが完全に吹っ飛んで大惨事なんてことはまず無いです。
まあGitを使っている人ならわかると思いますが、このコマンドは結構使います。例えば、ちょっとローカルでコードを弄ったあと、別の人がpushしたものをpullしようとする時など。
それで当時の状況ですが、サーバーに未コミットのコードがあったので、そっちのほうでこのコマンドを使ったら当然バージョン記録していない半年分のコードは漏れなく無かったことにされてしまうため、ローカルの方を弄ろうとしていました。
それでローカルの方で上記のコマンドを打とうとしたのですが、なんと選んでいたコンソールのウィンドウがサーバーの方だったんですよ。
入力した瞬間に嫌な予感がしたので確認したんですが、サーバー側のコンソールであることがわかり、この世の全ては終わった(終わってない)
諦めんなよ!!
ていうかさ、どっちのウィンドウか慎重に確認すべきだったよね?所長!
サーバーとローカルを両方開いて作業するってことは割とよくあるのですが、完全に不注意が祟りました。
もうやってしまったものはしょうがないんですが、どうにかする方法はあります。最後まで諦めてはいけません。
・エディタにログが残っていないか探す
・ストレージのバックアップを取っている場合はそこから戻す
まず、エディタのログを調べてみたんですが、戻せませんでした。また、今回の場合、ストレージのバックアップはシステム管理者に確認しましたが、ありませんでした。
万事休すでした。
先述した通り、メインの作業が別の作業に移行していて、吹っ飛んだ実装の代替えになりうるものも実は開発する予定だったため、案外すぐに切り替えられて、その御蔭で?ツイッターでは速攻ネタにできたし、泣きもしなかったけど、時間が経つにつれ、時間差で虚無感が襲ってきました。
だって、半年何やってたのって話になるじゃないですか。あはは。
じゃあどうやって復旧させたし?
1週間位経って、再び研究室に行ったときのこと。
普段は在宅ワークなので、その間研究室のPCはロックしたまま弄っていませんでした。
再起動していないので、当然エディタもそのまま立ち上がっていて、メンテ直後だったのでサーバーも連続稼働状態、更に有線だからかSSHのコネクションも繋がったままになっていました。
しかも、あの事故が起きた後、気味が悪くなってあの日は速攻帰宅していました。その結果、PCは事故当時のままの状態でした。
全てがそのまま時空を超えてその場に存在したので、一週間前の事故のことを嫌でも思い出してまたダメージを食らってしまったんですが、ダメ元で目の前に開かれたエディタに一週間前と同じことをしてみました。
あれ、戻せる…?
エディタ固有の話をしてもしょうがないので、そこは省きますが、一週間前に真っ先に確認したはずのことをしたら、ログが残ってました。
一件落着。
で終わったら多分関西人じゃなくてもキレそうになると思うので、私なりに次こんな事にならないための教訓を残したいと思います。
どうしてこうなったのか
まず、同じことをしたはずなのに、どうして事故った日には復旧せず、一週間経って復活したのかについて。
もはや推察することしかできないですが、おそらくあの状況下での確認は冷静ではなくテンパっていて、ちゃんと確認しているようでエディタのログの確認ができていなかったのではないか、ということが考えられます。
エディタの操作自体はCtrl+Zなので、間違えようがないと思えるのですが、もしかしたらCtrl+Yしていたかもしれないし、エディタが重くなっていて戻したのに変更が反映されていなかったのかもしれません。SSH越しなので、有線接続とはいえ、ネットの問題で画面に反映されるのが遅れていた可能性もあります。
次に、これを踏まえた上で、復旧できた要因について。
今回たまたま運良く一週間後にデータを復活させることができましたが、もし以下の行動を取っていたら、間違いなく復旧不可能になっていました。
・自暴自棄になってエディタを閉じる
・PCをシャットダウンする
・ディスプレイケーブル(有線LAN接続も同居している)を抜く
あきらめモードに入ったらコレくらいやりそうなもんですが、何故かしなかったのは不幸中の幸いでした。
しかも、全てのファイルが元に戻ったのは、たまたまエディタでcommitしてないファイルを全部開いた状態だったからでした。
対策
対策として、以下のようなことが考えられます。
・コンソールがローカルかサーバーかの確認はヒューマンエラーを避けられないので、バックアップを取る方向で対策する
・そもそも見栄を張らずにデバッグ中のコードでもコミットする
・ルールがあってちゃんとビルドできる状態じゃないとコミットできないとかだったとしても、せめてgit addはする
・バージョン管理しているからと言って油断しないでバックアップは別に取る
・エディタの自動ログファイル生成機能を有効にする
・事故ったときはその場で解決しようとしない
・事故当時の状況は心が落ち着くまで弄らないでおく
きっとどこかで誰かが同じようなことを既に提言しているとは思います。
今回の場合、デバッグコードがある状態でcommitしちゃいけないルールを誰かに課せられていたりはしていなかったので、データの復旧が確認できたら速攻commitしました。
起こるべくして起こった事故だったなというのは発生した直後から思っていましたし、事故当日にテンパっていたのはしょうがないと思いますが、後日データを復旧できたのはかなり奇跡的でした。
全部復旧できたのは本当に偶然が重なったからなので、復旧自体はあっさりでしたがマジで血の気の引く出来事です。
未コミットの変更を消すということ自体、Git使ってたら誰でもやらかす可能性があるので、皆さんも所長の失敗を踏み台に気をつけてくだされ。
所長はどうなったの?
さて、所長に関して心配なさっている声も聞かれました。
ちなみに所長が生き返るかはわからない…
— まゆつな空高🦾👹 計算機科学/工学系D進VTuber【Sky-High】 (@mayu27_sky_high) June 9, 2021
所長、復活ならず... 🙏🥺
— まゆつな空高🦾👹 計算機科学/工学系D進VTuber【Sky-High】 (@mayu27_sky_high) June 10, 2021
所長についての情報はこのツイート以降、完全に途絶えています。
しかし、データが復旧したとは言え、noteに詳細を書くと宣言した以上、触れないわけにはいかないでしょう。
実は、所長は仮死状態になっていて、所長の残した技術により私がその体を操ることでここまで所長のすべきタスクをこなしてきました。
しかし、データが復旧し、不吉なことも頻発しなくなり、引っ越しにより環境の変化もあったことで、まだ意識はありませんが所長は回復の兆しを見せています。7月に研究所チャンネル登録者100人&引っ越し記念配信を行う予定ですが、記念配信の頃には意識を取り戻していそうです。
というわけで、所長は無事に蘇生しそうです。心配してくださった皆様、この度はお騒がせしました。所長のためにありがとうございます。
所長復活の件については、記念配信でお話しようと思います。
というわけで、また記念配信お楽しみに!
ツイッター告知お見逃し無く!!