git 操作を間違えて作業を失わないために習慣化したこと


こんにちは、Gaji-Labo アシスタントエンジニアの石垣です。

今回は「git 操作で作業を飛ばさないために習慣化した対策」について書いてみたいと思います。

事件

以前、HTMLとCSSのコーディングをしていた時のことです。

その時は commit を一回もせずに作業を進めており、約一日分の作業が手元にのみ存在していました。

ブラウザ確認まで終え、作業を commit しようと git に触った時、間違えて git checkout -- . を叩き、手元にあった作業は全て消えてしまいました。

2.4 Git の基本 – 作業のやり直しにあるように、一度も commit されていないファイルに対して行った git checkout -- . を戻す方法はありません。それを自分はこの時身を持って実感しました。

また一日掛けてなんとか元の作業を取り戻したものの、一日分の遅れは進捗に大きな影響が出てしまいました。

対策

「気をつける」というのは勿論なのですが、意識するだけでは根本的な解決には至りません。

基本的には「バックアップを取る」ということなのですが、以下のことを習慣付けて必ず行うようにしたため、幸いその時のようなミスを起こすことは無くなりました。

こまめに commit する

これは当たり前のことなのですが、僕はこの一件の影響もあり、最近になってこまめに commit することが出来るようになりました。

とにかく commit をしてさえいれば、例えば git reset --hard でブランチの位置を戻してしまった時でも git reflog でサルベージは可能です。

そのためにも、なるべく commit はこまめにして、別の作業に移る時は必ずテンポラリーにでも commit をする習慣を付けました。

リポジトリに push できる時は push する

自分が持っているリポジトリで作業している時はもちろん、ある程度自由に push が出来るリポジトリで作業している場合であれば、 commit と同じく push もなるべく行うようにして、手元だけに作業がある状態を出来るだけ防ぐようにしています。

git checkout を使わない

これは僕が起こしたケース限定の話なのですが、 git checkout は機能が多すぎるということでバージョン 2.23 で checkout が担っていた「ブランチの切り替え作業」と「作業ツリーのファイル操作」の2つの作業がそれぞれ switch と restore に分割されました。(参考: git switchとrestoreの役割と機能について – Qiita)

というわけで、checkout を使うのをやめ、switch と restore を使うことで、以前のように軽率に checkout を使うようなことはしなくなりました。とは言え restore に同じ機能があるので、あくまで+αの対策といった感じです。

エイリアスに登録していたのを消した

以前はよく使うコマンドを盲目的にエイリアスに追加したりしていましたが、不可逆な変更を行うコマンドは出来るだけ叩く難度を上げるようにしました。

まとめ

今のところは今回書いたような習慣を付けることによってミスを防いでいますが、いつミスが起きるかわかりません。

その時のためにもこの習慣は忘れないように。また、今後起こりそうな他のミスも事前にこのような解決策を学んで防いでいけたらと思います。

Gaji-Laboでは、JavaScriptフレームワーク経験が豊富なパートナーさんを募集しています

Gaji-Laboでは、開発チームの一員としてプロジェクトに一緒に取り組んでくれる業務委託のパートナーさんを募集しています。

現在は特にJavaScriptフレームワーク実践と業務経験が豊富なWebフロントエンドエンジニアを必要としています。React + TypeScript、Vue.js、Next.js、Nuxt.js など、あなたの得意なフレームワークを教えて下さい!

パートナー契約へのお問い合わせもお仕事へのお問い合わせも、どちらもいつでも大歓迎です。まずはオンラインでのリモート面談からはじめましょう。ぜひお気軽にお問い合わせください!

お問い合わせしてみる!

関連リンク


投稿者 Ishigaki Shotaro

未経験から Gaji-Labo に入社。現在は React/TypeScript/Next.js の案件で MUI を使ったコンポーネント組み込みを担当。プロジェクトチームのリードとして共に組み込み作業をしているメンバーの進行管理も行っています。休日はだいたい家で音楽を聴いており、たまにライブに出かけています。