危険察知4 択難易度 応用

状況

サーバー上の作業ディレクトリを remote の main にそろえたい。作業者が状態を確認してから、次のコマンドを打とうとしている。

Enter の前に止めるべき点は?

$ git status --short M src/config.ts?? src/new-feature.ts$ git reset --hard origin/main

正答

  1. git fetch をしていないので、reset --hard がエラーで失敗する
  2. ?? の src/new-feature.ts も削除され、復元できなくなる
  3. src/config.ts の未コミットの変更が消え、Git からは復元できない
  4. reset --hard はコミットも消すので、reflog にも残らない

解説

reset --hard は追跡中のファイルの作業ツリーとインデックスを指定したコミットに合わせるため、src/config.ts の未コミットの変更が上書きされる。コミットされていない変更は reflog にも残らず、Git では戻せない。サーバー上で誰かが直接直した設定ということもある。git stash や git diff の控えで残してから実行する。?? の未追跡ファイルは reset --hard では消えない(消すのは git clean)。fetch していなくても手元の origin/main に合わせるだけでエラーにはならない。

参考: git-scm.com

gitresetuncommitted

この問題を含む 危険察知 のテストを制限時間つきで解く

危険察知クイズへ