Gitリポジトリにいるとしましょう。ファイルを削除して、その変更をコミットします。私は働き続け、さらにいくつかコミットします。それから、私はそのファイルを復元する必要があると思います。
git checkout HEAD^ foo.bar
を使用してファイルをチェックアウトできることはわかっていますが、そのファイルがいつ削除されたのかはわかりません。
手動でログをブラウズし、特定のSHAについてプロジェクト全体をチェックアウトしてから、そのファイルを元のプロジェクトのチェックアウトに手動でコピーする必要がないことを願っています。
与えられたパスに影響を与えた最後のコミットを見つけます。ファイルが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"
git log --diff-filter=D --summary
を使用します。git checkout $commit~1 path/to/file.ext
を使用してください。$commit
は、手順1で見つけたコミットの値です。 e4cf499627
フォルダ内の削除されたファイルをすべて復元するには、次のコマンドを入力します。
git ls-files -d | xargs git checkout --
削除したばかりのファイルを復元しようとしているのですが、まだ変更をコミットしていません。万が一この状況に遭遇した場合、あなたがする必要があるのは以下のことだけです:
git checkout HEAD -- path/to/file.ext
気が変な場合は、 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 .
bonyiii の answer (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"
コマンドラインからエイリアスを設定するために、私はこのコマンドを使用しました:
git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\""
あなたがファイル名を知っているなら、これは基本的なコマンドによる簡単な方法です:
そのファイルに対するすべてのコミットをリストします。
git log -- path/to/file
最後のコミット(一番上)はファイルを削除したものです。それで、最後から2番目のコミットを元に戻す必要があります。
git checkout {second to last commit} -- path/to/file
削除されコミットされたファイルを復元するには
git reset HEAD some/path
git checkout -- some/path
Gitバージョン1.7.5.4でテストされています。
変更を加えてファイルを削除しただけでコミットはしなかった場合、そして今あなたは自分の変更を解散しました。
git checkout -- .
しかし、あなたの削除されたファイルは戻ってこなかった、あなたは単に以下のコマンドをする:
git checkout <file_path>
そして、あなたのファイルが戻ってきました。
私は持っています この解決策 。
以下のいずれかの方法で、ファイルが削除されたコミットのIDを取得します。
git log --grep=*Word*
git log -Sword
git log | grep --context=5 *Word*
git log --stat | grep --context=5 *Word*
#推奨次のようになるはずです。
コミット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の直前にコミットしてください。
git checkout /path/to/deleted.file
多くの場合、 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
他の人が私の前で述べたように。
ファイルは削除前の状態に復元されます。維持したい場合は、作業ツリーに再度コミットすることを忘れないでください。
git undelete path/to/file.ext
これをあなたの.bash_profile
(あるいはあなたがコマンドシェルを開いたときにロードされる他の関連ファイル)に入れてください:
git config --global alias.undelete '!sh -c "git checkout $(git rev-list -n 1 HEAD -- $1)^ -- $1" -'
それから:
git undelete path/to/file.ext
この別名は、まずこのファイルが存在した最後のコミットを見つけるためにチェックし、次にこのファイルが存在した最後のコミットからそのファイルパスのgitチェックアウトを行います。 ソース
だから私は特定のコミットから削除されたファイルの束を復元しなければならず、私は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でクリアされました。ファイルを復元する必要がありましたが、その後それらをアンステージングする必要がありました。何百ものファイルを復元する必要がありましたが、他の例のようにファイルごとに手動で入力すると非常に遅くなりました。
実のところ、この質問は直接Git
に関するものですが、私のような人はgit WebStorm
コマンドについて知っている以外はcli
VCSのようなGUIツールを使っています。
削除したファイルが含まれているパスを右クリックしてから、Git
に移動し、Show History
をクリックします。
VCSツールはすべてのリビジョン列を表示し、それぞれのコミットと変更をすべて見ることができます。
それから私は私の友人がPostAd.js
ファイルを削除するコミットを選択します。今下記を見なさい:
そして今、私は私の欲望が削除されたファイルを見ることができます。ファイル名をダブルクリックするだけで回復します。
私の答えはGit
コマンドではないことを知っていますが、初心者やプロの開発者にとっては速く、信頼でき、そして簡単です。 Webstorm VCSツールはGit
を扱うのに最適で完璧で、他のプラグインやツールは必要ありません。
私は同じ質問をしました。知らないうちに、 ダングリングコミット を作成しました。
ダングリングコミットのリスト
git fsck --lost-found
ぶら下がっている各コミットを調べる
git reset --hard <commit id>
ダングリングコミットに移動したときに、ファイルが再表示されました。
理由はgit status
です。
“HEAD detached from <commit id where it detached>”
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
今回のケースでは、コミットで誤ってファイルを削除したが、後で失敗したため、変更されたファイルではなく削除されたすべてのファイルを元に戻したいと考えました。
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)
ファイルを削除したコミットがわかっている場合は、次のコマンドを実行します。ここで<SHA1_deletion>
はファイルを削除したコミットです。
git diff --diff-filter=D --name-only <SHA1_deletion>~1 <SHA1_deletion> | xargs git checkout <SHA1_deletion>~1 --
パイプの前の部分には、コミットで削除されたすべてのファイルがリストされています。それらはすべて以前のコミットからの復元です。
シンプルで正確な
まず第一に、あなたがそのファイルを持っている最新の安定したコミットを得てください -
git log
$ commitid 1234567 ...が見つかったとします。
git checkout <$commitid> $fileName
これにより、そのコミットに含まれていたファイルバージョンが復元されます。
私はこれが古いスレッドであることを知っています、しかしあなたはいつでもファイルを削除したあなたのコミットを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
はリポジトリに復元されました。
$ git log --diff-filter=D --summary | grep "delete" | sort