3050

私がGitリポジトリにいるとしましょう。ファイルを削除して、その変更をコミットします。私は仕事を続け、さらにいくつかのコミットを行います。次に、そのファイルを復元する必要があることがわかりました。

を使用してファイルをチェックアウトできることはgit checkout HEAD^ foo.bar知っていますが、そのファイルがいつ削除されたかはわかりません。

  1. 特定のファイル名を削除したコミットを見つける最も簡単な方法は何でしょうか?
  2. そのファイルを作業コピーに戻す最も簡単な方法は何でしょうか。

ログを手動で参照し、特定のSHAのプロジェクト全体をチェックアウトしてから、そのファイルを元のプロジェクトのチェックアウトに手動でコピーする必要がないことを願っています。

4

30 に答える 30

966
  1. git log --diff-filter=D --summaryファイルを削除したすべてのコミットとファイルを削除するために使用します。
  2. git checkout $commit~1 path/to/file.ext削除したファイルを復元するために使用します。

$commitステップ 1 で見つけたコミットの値はどこにありますか。e4cf499627

于 2009-06-04T23:10:48.090 に答える
332

フォルダ内の削除されたすべてのファイルを復元するには、次のコマンドを入力します。

git ls-files -d | xargs git checkout --
于 2010-12-02T06:11:12.730 に答える
140

削除したばかりのファイルを復元しようとしてこの質問にたどり着きましたが、まだ変更をコミットしていませんでした。このような状況に陥った場合に備えて、次のことを行う必要があります。

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

于 2014-04-10T00:03:18.123 に答える
100

気が狂っている場合は、を使用してくださいgit-bisect。何をすべきかは次のとおりです。

git bisect start
git bisect bad
git bisect good <some commit where you know the file existed>

次に、自動テストを実行します。シェルコマンドは、存在する'[ -e foo.bar ]'場合は0を返し、foo.bar存在しない場合は1を返します。の「実行」コマンドは、git-bisectバイナリ検索を使用して、テストが失敗した最初のコミットを自動的に見つけます。指定された範囲(良いものから悪いものへ)の途中から開始し、指定されたテストの結果に基づいて半分にカットします。

git bisect run '[ -e foo.bar ]'

今、あなたはそれを削除したコミットにいます。ここから、未来に戻ってgit-revert変更を元に戻すために使用できます。

git bisect reset
git revert <the offending commit>

または、1つのコミットに戻って、手動で損傷を検査することもできます。

git checkout HEAD^
cp foo.bar /tmp
git bisect reset
cp /tmp/foo.bar .
于 2009-06-04T22:46:40.900 に答える
81

私の新しいお気に入りのエイリアスは、bonyiii回答(賛成) と、「 Git エイリアス コマンドに引数を渡す」に関する私自身の回答に基づいています。

git config alias.restore '!f() { git checkout $(git rev-list -n 1 HEAD -- $1)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- $1)~1 | grep '^D' | cut -f 2); }; f'

数コミット前に誤って削除したファイルを紛失しましたか?
素早い:

git restore my_deleted_file

危機は回避されました。

警告、Git 2.23 (2019 年第 3 四半期) には(!)という名前の実験的なコマンドが付属しています。 したがって、このエイリアスの名前を変更します (以下に示すように)。git restore


Robert Daileyは、コメントで次のエイリアスを提案しています。

restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"

そしてjeganはコメントに追加します:

コマンドラインからエイリアスを設定するには、次のコマンドを使用しました。

git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\"" 
于 2013-02-17T15:33:29.783 に答える
64

ファイル名がわかっている場合、これは基本的なコマンドを使用した簡単な方法です。

そのファイルのすべてのコミットを一覧表示します。

git log -- path/to/file

最後のコミット (最上位) は、ファイルを削除したものです。そのため、最後から 2 番目のコミットを復元する必要があります。

git checkout {second to last commit} -- path/to/file
于 2016-02-27T01:50:11.000 に答える
30

削除してコミットしたファイルを復元するには:

git reset HEAD some/path
git checkout -- some/path

Gitバージョン1.7.5.4でテストされました。

于 2012-07-04T04:39:59.363 に答える
27

私はこの解決策を持っています。

  1. 以下のいずれかの方法を使用して、ファイルが削除されたコミットの ID を取得します。

    • git log --grep=*word*
    • git log -Sword
    • git log | grep --context=5 *word*
    • git log --stat | grep --context=5 *word*# 何も覚えていない場合におすすめ
  2. 次のようなものを取得する必要があります。

commit bfe68bd117e1091c96d2976c99b3bcc8310bebe7 作成者: Alexander Orlov 日付: 5 月 12 日木曜日 23:44:27 2011 +0200

replaced deprecated GWT class
- gwtI18nKeySync.sh, an outdated (?, replaced by a Maven goal) I18n generation script

commit 3ea4e3af253ac6fd1691ff6bb89c964f54802302 作成者: Alexander Orlov 日付: 5 月 12 日木曜日 22:10:22 2011 +0200

3 . コミット ID bfe68bd117e1091c96d2976c99b3bcc8310bebe7 を使用して、次のようにします。

git checkout bfe68bd117e1091c96d2976c99b3bcc8310bebe7^1 yourDeletedFile.java

コミット ID は、ファイルが既に削除されたコミットを参照するため、bfe68b の直前にコミットを参照する必要があります。これは、追加することで実行できます^1。つまり、bfe68b の直前にコミットしてください。

于 2012-03-01T10:48:03.963 に答える
25

ファイルを変更して削除しただけで、コミットはせず、変更を破棄した場合

git checkout -- .

削除したファイルが返されなかった場合は、次のコマンドを実行するだけです。

git checkout <file_path>

さきほど、ファイルが戻ってきました。

于 2016-09-02T15:30:19.997 に答える
15
git checkout /path/to/deleted.file
于 2013-06-25T19:40:19.830 に答える
11

多くの場合、 coreutils (grep、sed など) を Git と組み合わせて使用​​すると便利です。私はすでにこれらのツールをよく知っていますが、Git はあまりよく知りません。削除されたファイルを検索したい場合は、次のようにします。

git log --raw | grep -B 30 $'D\t.*deleted_file.c'

リビジョン/コミットを見つけたら:

git checkout <rev>^ -- path/to/refound/deleted_file.c

他の人が私の前に述べたように。

ファイルは削除前の状態に復元されます。保持したい場合は、作業ツリーに再コミットすることを忘れないでください。

于 2012-10-22T13:09:55.517 に答える
7

特定のコミットから削除された一連のファイルを復元する必要があり、2 つのコマンドでそれを管理しました。

git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git checkout <rev>^ -- 
git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git reset HEAD 

(各コマンドの末尾のスペースに注意してください。)

ファイルは .gitignore ファイルに追加され、.gitignore でクリアされましたgit rm。ファイルを復元する必要がありましたが、ステージングを解除しました。何百ものファイルを復元する必要があり、他の例のように各ファイルを手動で入力すると、非常に遅くなります。

于 2013-11-29T20:05:37.237 に答える
5

私たちの場合、コミットで誤ってファイルを削除し、後でいくつかのコミットで間違いに気づき、削除されたすべてのファイルを取り戻したいと考えましたが、変更されたファイルは取り戻しませんでした。

チャールズベイリーの優れた答えに基づいて、ここに私のワンライナーがあります:

git co $(git rev-list -n 1 HEAD -- <file_path>)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- <file_path>)~1 head | grep '^D' | cut -f 2)
于 2012-07-02T20:52:39.620 に答える
5
user@bsd:~/work/git$ rm slides.tex
user@bsd:~/work/git$ git pull 
Already up-to-date.
user@bsd:~/work/git$ ls slides.tex
ls: slides.tex: No such file or directory

削除されたファイルを復元します。

user@bsd:~/work/git$ git checkout
D       .slides.tex.swp
D       slides.tex
user@bsd:~/work/git$ git checkout slides.tex 
user@bsd:~/work/git$ ls slides.tex
slides.tex
于 2012-11-29T16:35:45.587 に答える
4

ファイルを削除したコミットがわかっている場合<SHA1_deletion>は、次のコマンドを実行します。 はファイルを削除したコミットです。

git diff --diff-filter=D --name-only <SHA1_deletion>~1 <SHA1_deletion> | xargs git checkout <SHA1_deletion>~1 --

パイプの前の部分には、コミットで削除されたすべてのファイルがリストされます。それらはすべて、以前のコミットからチェックアウトして復元します。

于 2015-12-03T01:04:34.163 に答える
3

それを行うための最良の方法については、試してみてください。


まず、ファイルを削除したコミットのコミット ID を見つけます。ファイルを削除したコミットの概要が表示されます。

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

git チェックアウト 84sdhfddbdddf~1

注:84sdhfddbdddあなたのcommit id

これにより、削除されたすべてのファイルを簡単に復元できます。

于 2020-03-06T09:59:27.457 に答える
2

プラス ポイント:以下の方法は、ゴミ箱やごみ箱からでもファイル/フォルダーが削除された場合に有効です。

ファイル/フォルダーは作業ツリーから削除されますが、まだコミットされていません:

I. 変更をまだインデックス化 (git add) していない場合は、ディレクトリの内容を元に戻すことができます。

git restore -- path/to/folder_OR_file

Ⅱ.削除が既にインデックス化されている場合は、最初にそれをリセットする必要があります。

git reset -- path/to/folder_OR_file

その後実行し、git restore path/to/folder_OR_file

ファイル/フォルダーは、過去のいくつかのコミットで削除されます:

  1. git log --diff-filter=D --summary ファイル/フォルダーが削除されたコミットの詳細を取得するために使用 します。
  2. git checkout $commit~1 path/to/folder_OR_file 削除したファイル/フォルダを復元するために使用 します。ステップ 1 で見つけたコミットの sha-value はどこ $commit にありますか? 例: c7578994
于 2021-05-30T16:18:37.383 に答える
-1

削除されたすべてのファイルを Git で復元するには、次のこともできます。

git checkout $(git ls-files --deleted)

Wheregit ls-files --deletedは、削除されたすべてのファイルをgit checkout $(git command)リストし、パラメーター内のファイルのリストを復元します。

于 2019-12-02T12:58:56.760 に答える