web-dev-qa-db-ja.com

gitでステージングされていない削除されたファイルを復元する

誤ってソースコードのディレクトリ全体を削除してしまいました... Nice rm-rを使用しました。私は知っています、本当に悪いです。しかし幸いなことに、私はそれを含むディレクトリにgitリポジトリを持っていました。したがって、gitには削除されたファイルのステージングされていない変更の膨大なリストがあります。例えば:

"deleted:   src/caronmonitor/server.py" 

これらのファイルを元に戻すにはどうすればよいですか? Web全体に実行するアドバイスがあります。

git checkout file

または

git revert <commit>

しかし、私が理解しているように、それはファイルを最後のコミット時の状態に復元します。最後のコミットに戻りたくありませんが、代わりに削除操作の直前に戻ります。 gitkを調べて、削除前のファイルを確認できます。したがって、これは可能でなければなりません。

10
Vance-Turner

いいえ、GIT 魔法をかけません。変更をステージングまたはコミットしなかった場合、それらはなくなります。削除を確認できますが、GITに記憶するように指示した最後の状態にしか戻すことができません。

ステージングとコミットによって変更を記憶するようにGITに明示的に指示する必要があります。

したがって、リポジトリにコンテンツを含むfile.txtがある場合:

    int main(argc[] args){
      System.out.println("example");
    }

これは、コミットまたはステージングされた最後の変更でした。

次に、file.txtを編集して、次のようなものを含めます。

int main(argc[] args){
 System.out.println("example");
 System.out.println("Hey I can print more lines");
}

ファイルを保存し、エディターを閉じ、gitで何もせず、rm -rこれでファイルがあり、gitにはファイルへの参照があり、ファイルは削除されましたが、git内のこのファイルの内容は次のとおりです。

    int main(argc[] args){
      System.out.println("example");
    }
6
Mateusz

はい、git checkout filenameを実行する必要があります

複数のファイルがあり、それらすべてを復元したい場合は、gitディレクトリのルートからgit checkout .を使用します。

チェックアウトにより、ファイルは追加/コミットされた最後のバージョンに復元されます。ファイルがまだ追加またはコミットされていない場合は、失われます。

したがって、たとえば:

$ git init && touch test1.txt test2.txt test3.txt
$ git add test1.txt && git commit -m "test1" && git add test2.txt
$ ls -a
.  .. .git test1.txt  test2.txt test3.txt

#deleting files below, 2 will be recovered, 3rd will be gone.
$ rm *
$ ls -a
.  .. .git

$ git checkout .
$ ls -a
.  .. .git test1.txt  test2.txt
#test3.txt is gone, test2.txt was recovered, even though not committed but just added
16
mu 無

gitは、追加またはコミットされたことのない変更を保存しません。あなたができる最善のことは、ディレクトリを削除したgit checkoutであり、最後にコミットされたときの状態に戻すことができます。

git checkout <branch_you_are_in> <directory_of_all_your_source_code>

あなたが見ているローカルのコミットされていない変更はおそらくコミットされていない削除です。つまり、gitはあなたがたくさんのファイルを削除したことを認識していますが、それらがまだ削除されているという事実をコミットしていないので、gitは「ねえ、いくつかの変更があります(この場合、削除)あなたはコミットしていません。

0
akgill