web-dev-qa-db-ja.com

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

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

git checkout -- <file>

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

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

他の変更を元に戻すことなくそのファイルを復元するためのコマンドは何ですか?

ボーナスポイント:また、破棄したい変更がファイルの追加である場合はどうなりますか?その変更をどのように展開するかを知りたいのですが。

431
lurscher

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>を元に戻すには、まだコミットしていないと仮定して、上の最初の行で十分です。

666
twalberg

両方の質問は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 --は決してステージング解除されず、ステージングされていない変更を破棄するだけです。

48
seppo0010

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

ファイルをステージングした後(git addを使用して暗黙的に変更をステージングすることもありますが、git rmを使用することもよくあります)、その変更をgit reset -- <file>で取り消すことができます。

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

10
Ben Jackson

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

git reset COMMIT_HASH file_path
git checkout COMMIT_HASH file_path
git add file_path

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

7
michaeldever