通常、ファイルへの変更を破棄するには、次のようにします。
git checkout -- <file>
破棄したい変更がファイルの削除である場合はどうなりますか?上記の行はエラーになります。
error: pathspec '<file>' did not match any file(s) known to git.
他の変更を元に戻すことなくそのファイルを復元するためのコマンドは何ですか?
ボーナスポイント:また、破棄したい変更がファイルの追加である場合はどうなりますか?その変更をどのように展開するかを知りたいのですが。
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>
を元に戻すには、まだコミットしていないと仮定して、上の最初の行で十分です。
両方の質問は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 --
は決してステージング解除されず、ステージングされていない変更を破棄するだけです。
あなたの2つの質問に対する答えは関連しています。 2番目から始めます。
ファイルをステージングした後(git add
を使用して暗黙的に変更をステージングすることもありますが、git rm
を使用することもよくあります)、その変更をgit reset -- <file>
で取り消すことができます。
あなたの場合は、ファイルを削除するためにgit rm
を使用していなければなりません。これは単にrm
でファイルを削除してからその変更をステージングすることと同じです。最初にgit reset -- <file>
でステージングを解除した場合は、git checkout -- <file>
で回復できます。
ステージングおよびコミットされている場合は、次のようにしてファイルをリセットします。
git reset COMMIT_HASH file_path
git checkout COMMIT_HASH file_path
git add file_path
これは、以前にいくつかのコミットが行われた削除に対して機能します。