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


97

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

だから私はいくつかの調査を行い、あなたがすることによってファイルを元に戻すことができることがわかりました git checkout <revision> -- <name of file>

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

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


1
git status実行するコマンドに関するヒントを提供します
Tavian Barnes

1
リモートリポジトリに古いディレクトリがまだあるようです(ローカルリポジトリにもある可能性があります)。強力な提案:1)リモートリポジトリから新しいリポジトリに「プル」します(ローカルリポジトリにこれ以上のダメージを与えないでください)。2)「チェックアウト」を試してください...または、新しいローカルのリポジトリで「元に戻す」:atlassian.com/git/tutorials/undoing-changes/git-revert。3)すべてが問題ないことを確認したら、リモートリポジトリを更新します。
paulsm4

回答:


244

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

また注意 、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> 

1
git checkout -- path/to/folder/* 動作しません 注:問題はファイルではなくフォルダーを復元する方法です
gman

@gman How can I retrieve all the files inside the directoryは、ディレクトリとそのファイルの両方を意味します。しかし、このコマンドは驚くほどうまくいきません。一年前にやったことを覚えています。
Nick Volynkin 16

2
@gmanですが、git checkout -- pathまたはのように機能しgit checkout -- 'path/*'ます。あなたの例git rmでは、OPが行わなかったと思われるものを削除します。そのような場合の手順を追加しました。ありがとう!
Nick Volynkin 16

3
Windowsでは、このように引用符を配置する必要があります:git checkout "<deleting_commit>^" -- <file_path>
Maor

リセットコマンドでフォルダーを指定したにもかかわらず、リポジトリ全体で多数の要素をステージング解除しました。これはどういう意味ですか?チェックアウトを実行すると、フォルダが復元されたようです。私は、残りのコードに対してunstageが何をしたかわかりません。ああ、集中リポジトリに使用されているピアツーピアリポジトリマネージャーの喜びです。
ポールケンジョラ

5

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

git checkout -- removed_directory

すべての変更を元に戻す場合は、次のようにします。

git reset --hard HEAD

3
git checkout -- removed_directory 動作しません
gman

git checkout -- removed_directory私のために働きましたが、私は以前にこのディレクトリを作成しました(checkoutそのディレクトリ内のファイルの1つによって)。作成後、このコマンドによってすべてのファイルがフォルダーに復元されました。
Boolean_Type

3

私にとってうまくいった唯一のことは、別のフォルダーでリポジトリをチェックアウトすることでした。現在のリポジトリが存在すると仮定します/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

git 2.24.0以降、実験的な新しいgitコマンドがあります:git restore

git restore --staged some/deleted/folder

git: 'restore'はgitコマンドではないことを示しています
Ahmed C

2

git restoreを使用してファイルまたはフォルダーを復元できます。

git restore --source master~1 "PATH_IN_YOUR_REPO"

ここでは、〜マスター1つの masterブランチから「1」リビジョンバックに戻しフォルダ。

ソース:https : //git-scm.com/docs/git-restore


0

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

理由 pullファイルを復元されていないと、そのGitは何の上にあなたが引っ張っていることを適用し、より多くの最近の変化として、あなたの欠失を見ています。

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


-1

コミットされていない削除の場合、これは次のように簡単です:

git reset HEAD rel / path / to / deleted / directory / *

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