削除されたファイルをgitでアンステージします


504

通常、ファイルへの変更を破棄するには、次のようにします。

git checkout -- <file>

破棄したい変更がファイルの削除である場合はどうなりますか?上記の行はエラーになります:

error: pathspec '<file>' did not match any file(s) known to git.

他の変更を取り消すことなく、その単一のファイルを復元するコマンドは何ですか?

ボーナスポイント:また、破棄したい変更がファイルの追加である場合はどうなりますか?その変化をステージから外す方法も知りたいのですが。


1
変更の破棄とステージングの解除は、2つの異なることですが、どのようなことを試みていますか?
アンドリューマーシャル

1
これは、1つの投稿で2つの異なる質問と問題です。これは答えをあまりにも多くし、不必要に混乱させます。
デビッドソプコ2017年

回答:


779

あなたが効果を元に戻すしたいと仮定しているgit rm <file>rm <file>が続くgit add -Aか、似たような:

# this restores the file status in the index
git reset -- <file>
# then check out a copy from the index
git checkout -- <file>

元に戻すにgit add <file>は、まだコミットしていないことを前提として、上記の最初の行で十分です。


70
--キーです。git reset <file>機能しません。それが私をここに連れてきた理由です。

2
end-of-options-marker削除されたファイルの場合にのみ必要なのはなぜですか?
haridsv 2017年

5
@handsv厳密には必須git reset HEAD <file>ではありませんが(代わりにを実行することもできます。これは同等です)、git reset前の最初の引数をend-of-options-markerファイル名ではなく参照名として扱います。もう少し柔軟に書けますか?多分。なぜでしたか?おそらく、開発者だけが確実に知っています。
twalberg

2
@twalbergは、git reset filename削除されていないファイルに対しては正常に機能します。
ブライアンゴードン

1
@AaronMahan- git reset <file>との違いについて教えてくださいgit reset -- <file>。Googleでその答えを見つけるのに苦労しています。
Neeraj B.

56

で両方の質問に回答しgit statusます。

新しいファイルの追加をアンステージするには git rm --cached filename.ext

# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   test

ファイルの削除を段階的に解除するには git reset HEAD filename.ext

# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    test

一方、git checkout --ステージングを解除しないで、ステージングされていない変更を破棄するだけです。


5
Debianのgit 1.7.2.5で削除されたファイルのヒントが表示されません。
tripleee

git status引用して見て良かった。現在と次回のセルフヘルプの方法をユーザーに示します。将来のgitバージョンで情報が追加または更新された場合に備えています。
ウィルケイン

これは間違っています。「コミットされる変更」は、以前に表示されるものですgit resetの後git reset、「変更されたが更新されていない」と表示されます。これは、git作成者の母国語で「変更がステージングされていない」ことを意味します。さらに重要なのは、「gitステータスはあなたが知っているすべてのものを教えてくれる」というドグマ全体が嘘であるということです。(人の時間を浪費していて解雇されるべきだと言うマネージャー)
personal_cloud

11

あなたの2つの質問に対する答えは関連しています。私は2番目から始めます:

ファイルをステージングすると(多くの場合git add、を使用しますが、他のいくつかのコマンドも変更を暗黙的にステージングしますgit rm)、その変更をで取り消すことができますgit reset -- <file>

あなたの場合、あなたgit rmはファイルを削除するのに慣れている必要があります。これは、単にそれを削除してrmから、その変更をステージングすることと同じです。最初にステージングを解除したgit reset -- <file>場合は、で回復できますgit checkout -- <file>


7

ステージングおよびコミットされている場合は、次のようにしてファイルをリセットします。

git reset COMMIT_HASH file_path
git checkout COMMIT_HASH file_path
git add file_path

これは、以前にいくつかのコミットが行われた削除に対して機能します。


1
より効率的ですgit revert COMMIT_HASH
Flair

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.