[git]間違えて git stash たの復旧手順

TIPS

作業中に別のブランチへ切り替える際や、動作確認をしたいときに便利な git stash。

しかし、「まだ退避させるつもりじゃなかったのに叩いてしまった」「どこまで退避されたかわからなくなって焦った」という経験はありませんか?

安心してください。git stash で一時退避された作業内容は消えておらず、安全に手元へ復旧できます。

今回は、

  1. 「何をstashしてしまったのか」中身を確認する方法
  2. 作業内容を元の状態へ復旧する手順・オプションの違い
  3. 誤って stash drop や stash clear で消してしまった場合の救出法

を整理して解説します。

1. 何をstashしたのか確認する(中身のチェック)

復旧させる前に、まず退避された変更内容を確認しましょう。

一覧の確認

現在退避されているstashのリストを表示します。

git stash list

出力例:

stash@{0}: WIP on main: a1b2c3d Commit message here
stash@{1}: WIP on feature: e4f5g6h Another commit

一番上にある stash@{0} が、直前に実行した最新のstash です。

変更された「ファイル名」を確認する

どのファイルが変更されていたかを手短に把握したい場合は、git stash show を実行します。

# 最新のstash対象ファイルを確認
git stash show

# 特定のstashを指定する場合
git stash show stash@{0}

変更の「具体的な差分(コード)」を確認する

どの行を書き換えていたか、コードレベルの差分を見るには -p(patch)オプションを付けます。

git stash show -p

通常の git diff と同様に、追加・削除された行が詳細に表示されます。

2. stashした作業を復旧する(主要オプションの使い分け)

中身を確認できたら、作業ディレクトリへ変更を戻します。

復旧コマンドには主に pop と apply の2種類があります。

パターンA:復旧と同時にリストから削除する(git stash pop)

最も一般的に使われる方法です。最新の退避内容を作業ツリーに戻し、stash一覧からそのデータを削除します。

git stash pop
  • 使いどころ: 「間違えて退避してしまったので、今すぐ作業をそのまま再開したい」とき。

パターンB:stashを残したまま復旧する(git stash apply)

作業ツリーに変更を戻しますが、stashリスト上にはデータをそのまま残しておきます。

git stash apply
  • 使いどころ: 「まずは変更を戻してテストしたいが、念のため退避データ自体も保険として残しておきたい」とき。
  • 不要になったら後から手動で git stash drop を実行して削除できます。

ステージング状態(Index)も一緒に復元したい場合(--index)

git add していた変更と、まだ add していなかった未ステージの変更が混ざっていた場合、通常の pop や apply ではすべて未ステージ状態に戻ってしまいます。

git add していた状態も含めて完全再現したい場合は、--index オプションを付与します。

git stash pop --index
# または
git stash apply --index

3. もしコンフリクト(競合)が起きたら?

stashした後に別ブランチへ移動していたり、ファイルを書き換えていたりすると、pop や apply を実行した際に競合(Conflict)が発生することがあります。

  1. 競合箇所を手動で修正します。
  2. 修正したファイルをステージングします。
    Bashgit add <解消したファイル名>
  3. ※注意:競合が発生した場合、git stash pop を実行していてもデータ保護のためstashリストから自動削除されません。競合解消後に手動で削除してください。
    Bashgit stash drop stash@{0}

4. 【番外編】誤って git stash drop や clear で消してしまったら?

「間違えて pop ではなく drop してしまった」「clear で全消ししてしまった」という場合でも、Gitのコミットオブジェクトとして一定期間残っているため救出できる可能性があります。

  1. 到達不能なオブジェクトを探索する
    Bashgit fsck --unreachable | grep commit
  2. 中身を確認する表示されたハッシュ値を git show で1つずつ確認し、探しているコードを探します。
    Bashgit show <コミットハッシュ>
  3. 変更を復旧する該当のハッシュが見つかったら、それを指定して適用します。
    Bashgit stash apply <コミットハッシュ>

まとめ:よく使うコマンドチートシート

git stash は作業を失うコマンドではなく、安全な一時保管庫に入れるコマンドです。焦らず git stash show -p で中身を確認し、git stash pop で元の作業に戻りましょう。

やりたいことコマンド
stash一覧を見るgit stash list
変更ファイル名を見るgit stash show
具体的な差分を見るgit stash show -p
戻してstashから消すgit stash pop
戻してstashも残すgit stash apply
ステージング状態も再現git stash pop --index

コメント

タイトルとURLをコピーしました