状況
サーバー上の作業ディレクトリを remote の main にそろえたい。作業者が状態を確認してから、次のコマンドを打とうとしている。
Enter の前に止めるべき点は?
$ git status --short M src/config.ts?? src/new-feature.ts$ git reset --hard origin/main正答
git fetchをしていないので、reset --hard がエラーで失敗する- ?? の src/new-feature.ts も削除され、復元できなくなる
- src/config.ts の未コミットの変更が消え、Git からは復元できない
- reset --hard はコミットも消すので、reflog にも残らない
解説
reset --hard は追跡中のファイルの作業ツリーとインデックスを指定したコミットに合わせるため、src/config.ts の未コミットの変更が上書きされる。コミットされていない変更は reflog にも残らず、Git では戻せない。サーバー上で誰かが直接直した設定ということもある。git stash や git diff の控えで残してから実行する。?? の未追跡ファイルは reset --hard では消えない(消すのは git clean)。fetch していなくても手元の origin/main に合わせるだけでエラーにはならない。
参考: git-scm.com
この問題を含む 危険察知 のテストを制限時間つきで解く
危険察知クイズへ