web-dev-qa-db-ja.com

Gitリポジトリで削除されたファイルを見つけて復元する

Gitリポジトリにいるとしましょう。ファイルを削除して、その変更をコミットします。私は働き続け、さらにいくつかコミットします。それから、私はそのファイルを復元する必要があると思います。

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

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

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

2598
avdgaag

与えられたパスに影響を与えた最後のコミットを見つけます。ファイルがHEADコミットに含まれていないため、このコミットによって削除されたはずです。

git rev-list -n 1 HEAD -- <file_path>

それから、キャレット(^)シンボルを使用して、前のコミットでバージョンをチェックアウトします。

git checkout <deleting_commit>^ -- <file_path>

$fileが問題のファイルである場合、あるいは1つのコマンドで。

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

Zshを使用していてEXTENDED_GLOBオプションを有効にしている場合、キャレット記号は機能しません。代わりに~1を使うことができます。

git checkout $(git rev-list -n 1 HEAD -- "$file")~1 -- "$file"
2943
CB Bailey
  1. ファイルを削除したすべてのコミットとファイルを削除するには、git log --diff-filter=D --summaryを使用します。
  2. 削除したファイルを復元するにはgit checkout $commit~1 path/to/file.extを使用してください。

$commitは、手順1で見つけたコミットの値です。 e4cf499627

800
Robert Munteanu

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

git ls-files -d | xargs git checkout --
307
Manu

削除したばかりのファイルを復元しようとしているのですが、まだ変更をコミットしていません。万が一この状況に遭遇した場合、あなたがする必要があるのは以下のことだけです:

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

117
Brett

気が変な場合は、 git-bisect を使用してください。ここで何をすべきかです:

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

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

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 .
88
Josh Lee

bonyiiianswer (upvoted)に基づく私の新しいお気に入りのエイリアス、および " 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

危機は避けられた。


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\"" 
70
VonC

あなたがファイル名を知っているなら、これは基本的なコマンドによる簡単な方法です:

そのファイルに対するすべてのコミットをリストします。

git log -- path/to/file

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

git checkout {second to last commit} -- path/to/file
45
wisbucky

削除されコミットされたファイルを復元するには

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

Gitバージョン1.7.5.4でテストされています。

29
Fedir RYKHTIK

変更を加えてファイルを削除しただけでコミットはしなかった場合、そして今あなたは自分の変更を解散しました。

git checkout -- .

しかし、あなたの削除されたファイルは戻ってこなかった、あなたは単に以下のコマンドをする:

git checkout <file_path>

そして、あなたのファイルが戻ってきました。

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

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

    • git log --grep=*Word*
    • git log -Sword
    • git log | grep --context=5 *Word*
    • ほとんど覚えていない場合はgit log --stat | grep --context=5 *Word*#推奨
  2. 次のようになるはずです。

コミットbfe68bd117e1091c96d2976c99b3bcc8310bebe7作成者:Alexander Orlov日付:Thu May 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日付:Thu May 12 22:10:22 2011 +0200

3 。今度はコミットID bfe68bd117e1091c96d2976c99b3bcc8310bebe7を使用します。

git checkout bfe68bd117e1091c96d2976c99b3bcc8310bebe7^1 yourDeletedFile.Java

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

23
Alex
git checkout /path/to/deleted.file
15
user1528493

多くの場合、 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

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

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

11
Thomas E

git undelete path/to/file.ext

  1. これをあなたの.bash_profile(あるいはあなたがコマンドシェルを開いたときにロードされる他の関連ファイル)に入れてください:

    git config --global alias.undelete '!sh -c "git checkout $(git rev-list -n 1 HEAD -- $1)^ -- $1" -'
    
  2. それから:

    git undelete path/to/file.ext
    

この別名は、まずこのファイルが存在した最後のコミットを見つけるためにチェックし、次にこのファイルが存在した最後のコミットからそのファイルパスのgitチェックアウトを行います。 ソース

10
Beau Smith

だから私は特定のコミットから削除されたファイルの束を復元しなければならず、私は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ファイルに追加され、それからgit rmでクリアされました。ファイルを復元する必要がありましたが、その後それらをアンステージングする必要がありました。何百ものファイルを復元する必要がありましたが、他の例のようにファイルごとに手動で入力すると非常に遅くなりました。

7
kzar

実のところ、この質問は直接Gitに関するものですが、私のような人はgit WebStormコマンドについて知っている以外はcli VCSのようなGUIツールを使っています。

削除したファイルが含まれているパスを右クリックしてから、Gitに移動し、Show Historyをクリックします。

enter image description here

VCSツールはすべてのリビジョン列を表示し、それぞれのコミットと変更をすべて見ることができます。

enter image description here

それから私は私の友人がPostAd.jsファイルを削除するコミットを選択します。今下記を見なさい:

enter image description here

そして今、私は私の欲望が削除されたファイルを見ることができます。ファイル名をダブルクリックするだけで回復します。

enter image description here

私の答えはGitコマンドではないことを知っていますが、初心者やプロの開発者にとっては速く、信頼でき、そして簡単です。 Webstorm VCSツールはGitを扱うのに最適で完璧で、他のプラグインやツールは必要ありません。

5
AmerllicA

私は同じ質問をしました。知らないうちに、 ダングリングコミット を作成しました。

ダングリングコミットのリスト

git fsck --lost-found

ぶら下がっている各コミットを調べる

git reset --hard <commit id>

ダングリングコミットに移動したときに、ファイルが再表示されました。

理由はgit statusです。

“HEAD detached from <commit id where it detached>”

5
rustyMagnet
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
5
user1797498

今回のケースでは、コミットで誤ってファイルを削除したが、後で失敗したため、変更されたファイルではなく削除されたすべてのファイルを元に戻したいと考えました。

Charles Baileyの優れた答えに基づいて、私の唯一のライナーは次のとおりです。

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)
4
bonyiii

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

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

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

4
Tony Wickham

シンプルで正確な

まず第一に、あなたがそのファイルを持っている最新の安定したコミットを得てください -

git log 

$ commitid 1234567 ...が見つかったとします。

git checkout <$commitid> $fileName

これにより、そのコミットに含まれていたファイルバージョンが復元されます。

2
Sudhanshu Jain

私はこれが古いスレッドであることを知っています、しかしあなたはいつでもファイルを削除したあなたのコミットをgit revertすることができます。 ( これは、削除がコミットの唯一の変更であると想定しています。

> git log 
commit 2994bda49cd97ce49099953fc3f76f7d3c35d1d3
Author: Dave <[email protected]>
Date:   Thu May 9 11:11:06 2019 -0700

    deleted readme.md

そして、作業を続けていて、後でその削除コミットをコミットしたくないと気付いた場合は、を使って元に戻すことができます。

> git revert 2994bd

git logは次のようになります。

> git log
Author: Dave <[email protected]>
Date:   Thu May 9 11:17:41 2019 -0700

    Revert "deleted readme"

    This reverts commit 2994bda49cd97ce49099953fc3f76f7d3c35d1d3.

そしてreadme.mdはリポジトリに復元されました。

0
Dave Baghdanov
$ git log --diff-filter=D --summary  | grep "delete" | sort
0
kujiy