削除後にコミットが行われなかった削除済みファイルのgitリカバリ


812

一部のファイルを削除しました。

まだコミットしていません。

ワークスペースをリセットしてファイルを回復したい。

しましたgit checkout .

しかし、削除されたファイルはまだありません。

そしてgit status示しています:

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    cc.properties
#   deleted:    store/README
#   deleted:    store/cc.properties
#

なぜgit checkout .ワークスペースをにリセットしないのHEADですか?


16
削除後に変更をステージングしていなかった場合は、git checkout .問題なく機能します。
ファイサル、2014年

10
@faizalを使用すると、変更を失うことになります。
Vasiliy Yorkin 2015

1
削除したアイテムに対してgit guiでCtrl-Jを押すだけです。
ajeh

git checkout-cc.properties store / README store / cc.properties
Vinod Pasi

:この回答を参照してくださいquora.com/...
ライブ-愛の

回答:


787

出力は、何をする必要があるかを示します。git reset HEAD cc.properties

これにより、rm操作のステージが解除されます。その後、git statusもう一度実行するとgit checkout -- cc.properties、ファイルを元に戻すためにa を実行する必要があることがわかります。

更新:これは私の設定ファイルにあります

$ git config alias.unstage
reset HEAD

私は通常、ステージのアンステージに使用します。


5
複数の削除済みファイルに対してこれをどのように行いますか?git reset HEAD << filename >>を複数回実行するのは面倒ですが、それを実行する効率的な方法はありますか?
SubSul 2016年

70
git reset HEAD \*そしてgit checkout -- .
ヌファルイブラヒム2016

3
しかし、私はファイルを変更しました。
Jiang YD、2016

@RauliRajandeあなたの状況は、元の質問で説明された状況とは異なる可能性があります。
Noufalイブラヒム2018

1
rm -r ./engines- おっとっと。今git reset engines; git checkout engines
クリス2018

209

削除をステージングしたので、次のことを行う必要があります。

git checkout HEAD cc.properties store/README store/cc.properties

git checkout . 削除がすでにステージングされているインデックスからのみチェックアウトします。


177

するだけ git checkout path/to/file-I-want-to-bring-back.txt


8
ファイルがコミットおよびプッシュされていない場合にのみ機能します。
mahen3d 2015

23
私にとってはうまくいきませんでした、gitはその名前のファイルを認識していませんが、ファイルは追跡されています。私もコミットしませんでした。誤ってnetbeansのコンテキストメニューを使用してファイルを削除しただけです。
Zelphir Kaltstahl、2015

4
@Zelphir +1error: pathspec 'file.ext' did not match any file(s) known to git.
Ivan Borshchov '29

@ user3479125ファイルがコミットされたことはないと思います。git statusそれについて何と言いますか?
ki92 16

12
Gitステータスは、緑の「delated file.ext」git checkout HEAD -- file.extが復元に役立つことを示しました。
Ivan Borshchov 2016

144

各単一パスを指定せずに、ステージングされていないすべての削除を一度に自動的に回復するには:

git ls-files -z -d | xargs -0 git checkout --

ステージングされたすべての削除を、各パスを指定せずに、自動的に一度に回復するには:

git status | grep 'deleted:' | awk '{print $2}' | xargs git checkout --

12
500個を超えるファイルを誤って削除しましたが、有効な変更もすべて保持されていたため、これで問題なく動作しました(最初の行は使用したものです)。ありがとう。
ガイ・ロウ

1
ビルドが成功した直後に、リポジトリのすべてのコンテンツを誤って削除しました。最初のコマンドは私のベーコンを救いました。
MonaLisaOverdrive 2015年

2
これがうまくいく前に、私は走らなければなりませんgit status --long | grep 'deleted:' | awk '{print $2}' | xargs git reset HEAD --でした。
Ian Dunn

1
非常に便利で、追跡されていないファイルを保持したいが、削除および変更を取り除き、変更を処理するために-dを-mに変更しただけです。
RaisinBranCrunch 2017

5
ファイル名/パスにスペースがある場合、これは機能しないことに注意してください。git ls-files -d | sed -e "s/\(.*\)/'\1'/" | xargs git checkout --うまくいくと思います。
パセリ72 2017年

79

を実行しているgit checkout .ため、ブランチを最後のコミット状態に復元しようとしているようです。

あなたはこれを達成することができます git reset HEAD --hard

警告

これを行うと、最新の変更がすべて削除され、変更がステージング解除される場合があります。たとえば、作業が失われる可能性があります。それあなたが望むものかもしれませんが、ドキュメントをチェックし確認しください。


39
すごい!これに注意してください!!!! あなたは正しいかもしれませんが、誰かが混乱し、コード全体を爆破する可能性があります。大きな警告を追加するといいでしょう。
santiagobasulto 2013年

3
これはまさに私が必要としたものです。コード全体を爆破することはありません。単に最新のコミットに戻るだけです。
Andrew Hendrie、2015

2
ある時点で何百ものファイルがなくなってしまいました。これが問題を修正する唯一の実用的な方法です。ありがとう!
ジョナサンベン2015

66

あなたが使用した場合

git rm filename

ファイルを削除するには

git checkout path/to/filename

動作しないので、その場合

git checkout HEAD^ path/to/filename

うまくいくはず


2
私はこの答えが好きです。削除した特定のファイルのみに影響していることは間違いありません。1)git checkout path / to / filename 2)git checkout-path / to / filename
Ed of the Mountain

優秀な。git checkout HEAD^ path/to/filenameファイルをコミットしていなかったので私のために働いた。
Moses Ndeda

29

これは私のMacで私を助けたコマンドです。他の解決策をいくつか試しましたが、うまくいきませんでした。

OSX MavericksのGitバージョン

mac-pro:main chris$ git version
git version 1.8.5.2 (Apple Git-48)

コマンド

git checkout HEAD -- path/to/file/file.cc


18

git ls-files削除されたファイル(-d)または変更されたファイル(-m)をチェックアウトするために使用します。

git checkout $(git ls-files -d)

gitチェックアウトで変更されたファイルのみを復元するにどうすればよいですか?


他のソリューションよりもはるかに優れてシンプル
joshi123

1
一部のファイルにスペースがある場合は、実行できますgit ls-files -d | xargs -I{} git checkout "{}"
Jean Paul

17

すべてのファイルを一度に復元したい場合

ピリオドはすべてのファイルを取得するようにgitに指示するため、忘れずに使用してください。

このコマンドは、ヘッドをリセットし、すべての変更をステージ解除します。

$ git reset HEAD . 

次に、これを実行してすべてのファイルを復元します。

$ git checkout .

次にgitステータスを実行すると、次のようになります。

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

これは、最も単純なソリューションであり、多数のファイルに対して機能します(複数のファイル/フォルダーを削除したとしましょう)。good job dude +
Gkiokan

9

これを見たいですか

それはあなたが使用した場合に行きます

git checkout -- .

何かをコミットする前に。

また、まだ作成されていない作成済みファイルを削除することもできます。そして、あなたはそれらを望んでいません。と:

git reset -- .

コピーした回答を完全には報告していません。実際、git checkout -- .削除されたファイルを回復するのに役立ちませんし、質問者が試みたものと同等です:git checkout .。機能する部分は、コピーしなかった部分ですgit checkout <file_path>
ジャンポール

6

他のブランチからのマージ後に私の作業ディレクトリで削除されたファイルを元に戻す方法に関する回答を探しているときに、この投稿を見つけました。マージ後、まだコミットは行われていません。進行中のマージだったので、次のコマンドを使用して追加することはできません。

$ git reset <commitid#-where-file.cpp-existed> file.cpp

ファイルを元に戻すには、リセットに加えて別の手順を実行する必要がありました。

$ git checkout -- file.cpp

4

変更をコミットしていない場合は、それらの変更を隠しておくだけで、最後に機能していたコミットに戻ります。

git stash
git stash clear
git clean 

スタッシュスタックに置くことは解決策ではありません。ハックです。
Robert Dolca、2015年

2
stcから削除できるため、thiscは優れたソリューションです。ハックであるかどうかは、好みの問題です。stashの全体的なアイデアは巧妙なハックです。
EinoMäkitalo16年

@EinoMäkitaloがあなたのお役に立ててうれしいです:)
Rick

私はこのアプローチがリストにあるものの中で一番好きです
ckapilla

3

削除されたディレクトリを探している場合。

 git checkout ./pathToDir/*

3

以下は、他の人を助けるためのリファレンスとしてのさまざまなケースです。

削除がコミットされいない場合、以下のコマンドを実行すると、削除されたファイルが作業ツリーに復元されます。

$ git checkout -- <file>

以下のコマンドを使用して、作業ツリーで削除されたすべてのファイルのリストを取得できます。

$ git ls-files --deleted

削除がコミットされいる場合は、削除が行われた場所を見つけ、このコミットからファイルを復元します。

#find the commit hash where it had this file deleted
$ git rev-list -n 1 HEAD -- <file>

それはあなたのようなものを与えるはずですc46e81aa403ecb8a0f7a323a358068345、今ここでcommit#を使用してください

$ git checkout <commit>^ -- <file>

このようなもの:$ git checkout c46e81aa403ecb8a0f7a323a358068345-

回復するファイルのパスを探している場合、次のコマンドを実行すると、削除されたすべてのファイルの概要が表示されます。

$ git log --diff-filter=D --summary

ファイルのリストだけを表示したい場合:

git log --diff-filter=D --summary | grep "delete mode"

2

私にとってうまくいったのは git checkout {SHA1 of commit with version to restore} "{path to file to restore}"

例えば git checkout 5a6b3179e58edff9c90326b9a04284b02fd67bd0 "src-ui/views/includes/radar.pug"

(ファイルを入れたいブランチで実行されます)

そのコマンドが実行された後、復元されたファイルは元の場所に存在します(comitedする必要があります)


および/または単に、git checkout master path/to/the/file.bin他の変更を失うことなくそのファイルの削除を取り消すため。PS:これは受け入れられる答えになるはずです...
Edoardo

1

ToroiseGITをインストールした場合は、親フォルダのポップアップメニューの[元に戻す...]メニュー項目を選択してください。


1

1.以下を使用して、元に戻したい特定のコミットを見つけます:

   git log
This command will give you a list of commits done by you .

2.を使用してそのコミットに戻します。

    git revert <commit id> 

今、あなたのローカルブランチは特にすべてのファイルを持っています


これは、変更をすでにコミットしている場合に機能します。
live-love

1

注意:最初に保持したい作業をコミットしてください。

あなたはありリセットワークスペースを(および削除されたファイルを回復します)

git checkout ./*

2
参考までに...このコマンドを実行すると、すべての作業ファイルが削除され、削除されたファイルは復元されませんでした。注意
hendr1x

このため、このコマンドを使用してワークスペースをリセットします。それは自明だと思いました。
HenriqueFlorêncio18年

1
このコマンドは機能しません。ファイルが削除されると、によってキャッチされないため./*です。
ジャンポール

@JeanPaul誤解しているかもしれませんが、ワークスペースが元の状態になりました(削除されたファイルが存在します)。
マルク

@Marcこれは機能しますが、ディレクトリに可視ファイルがない場合のみです。それ以外の場合./*は、gitに送信される前にそれらのファイルと一致するようにbashによって展開されます。
ジャンポール、

0

私は同じ問題を抱えていましたが、上記の解決策はどれもうまくいきませんでした。私がやったことは:
-同じ名前の空のファイルを作成する
-このファイルをそのローカル履歴と比較する
-履歴を空のファイルにコピーする。


-1

私は同じ問題を抱えていましたが、ここで試した答えのどれも私のために働きませんでした。私はIntellijを使用していますが、新しいブランチgit checkout -b minimalExampleをチェックアウトして、プロジェクトの一連のファイルを削除し、他の多くのファイルを変更することにより、問題の新しいブランチに「最小限の例」を作成しました。残念ながら、新しい「最小限の例」ブランチで変更をコミットしていませんが、「元の」ブランチをもう一度チェックアウトしたところ、「最小限の例」ブランチからのすべての変更と削除は、「オリジナルの」ブランチも(またはそう表示された)。git status削除されたファイルによると、両方のブランチから削除されました。

幸い、Intellijは「これらのファイルを削除しても完全に回復できない可能性がある」と警告しましたが、プロジェクトを右クリックして[Local History]を選択することで、ファイルを(実際に削除された最小のブランチ例で)復元できました>履歴を表示します(その後、私が欲しかった最新の履歴アイテムを復元します)。Intellijが「最小限の例」のブランチにあるファイルを復元した後、ブランチをオリジンにプッシュしました。次に、「元の」ローカルブランチに切り替え、実行git pull origin minimalExampleして「元の」ブランチにも戻しました。

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