web-dev-qa-db-ja.com

Gitリポジトリで削除されたフォルダーを復元する

フォルダー内のすべてのコンテンツを削除しましたが、フォルダーは空です。リモートリポジトリにまだコピーがありました。しかし、git pullを実行したときに、削除されたファイルを元に戻さなかったのは、そうすることではないのでしょうか?

そこで、いくつかの調査を行ったところ、git checkout <revision> -- <name of file>を実行することでファイルを元に戻すことができることがわかりました。

しかし、それはファイルに対してのみ機能します。

ディレクトリ内のすべてのファイルを取得するにはどうすればよいですか?

66
json2021

ファイルでできることはすべて、フォルダーでもできます。

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

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

変更をまだインデックス付けしていない場合(git add)、ディレクトリのコンテンツを元に戻すことができます。

git checkout -- path/to/folder

削除のインデックスがすでに作成されている場合は、最初に削除する必要があります。

git reset -- path/to/folder
git checkout -- path/to/folder

作業ツリー全体(単一のフォルダーではない)を復元しますが、コミットされていない変更はすべて失われます

git reset --hard HEAD

過去のコミットでファイルが削除された場合:

指定されたパスに影響を与えた最後のコミットを見つけます。ファイルはHEADコミットにないため、このコミットはファイルを削除している必要があります。

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

次に、キャレット(^)記号を使用して、以前のコミット時にバージョンをチェックアウトします。

git checkout <deleting_commit>^ -- <file_path>

遠くのコミットから作業ツリー全体を復元する

git reset --hard <revision> 
182
Nick Volynkin

変更をまだコミットしていない場合は、コンテンツまたはディレクトリを元に戻すことができます。

git checkout -- removed_directory

すべての変更を元に戻したい場合:

git reset --hard HEAD
5
Ivan Mushketyk

私のために働いた唯一のことは、別のフォルダのレポをチェックアウトすることでした。現在のリポジトリが/home/me/currentにあると仮定します。

それから

git clone /home/me/current /home/me/temp

これにより、/home/me/temp内のレポの個別のクローンが作成されます

これで、/home/me/tempに移動して、好きなことを行うことができます。例えば

git reset --hard commit-hash-before-delete

削除したファイルフォルダーをコピーして戻すことができます

cp -r /home/me/temp/some/deleted/folder /home/me/current/some/deleted/folder

そして、一時フォルダーを削除します

rm -rf /home/me/temp

の例

git checkout -- some/deleted/folder
git checkout -- some/deleted/folder/*

動作しない

$ git checkout -- some/deleted/folder/*
zsh: no matches found: some/deleted/folder/*
$ git checkout -- some/deleted/folder
error: pathspec 'some/deleted/folder' did not match any file(s) known to git.

その他の例

git reset --hard HEAD

削除されたファイルだけでなく破壊的です。その他の変更も失われます。

同様に

git reset --hard some-commit

some-commitの後にコミットが失われます

2
gman

特定のファイルを指定しない場合、特定のコミットの全内容をプルできるはずです。 Like:git checkout 264794319e9695ba843cd6(そのハッシュがすべてのファイルを正しい状態に持っていると仮定して)。

pullがファイルを復元しないのは、gitが削除を最新の変更と見なし、それをプルするものの上に適用するためです。

(新しいブランチで実験することをお勧めします。)

0
lostphilosopher