gitリポジトリの履歴からディレクトリ全体を復元する方法は?


90

gitリポジトリの履歴からディレクトリ全体を(再帰的に)復元したいと思います。

ブランチ(マスター)は1つだけです。

エラーが含まれたコミットを知っています。

親コミットのsha1ハッシュを使用して、エラーが含まれる前のディレクトリの状態を復元できますか?

私はこのようなものについて考えました:

git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 path/to/the/folder/

しかし、それはうまくいきませんでした。


7
「 - 」を追加してみてくださいリビジョンとパスの間:git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/
カルロスCampderrós

これは役に立ちました。どうもありがとうございました。
2012年

1
@CarlosCampderrós他の人がやる前に実際の答えとしてそれを書き、15ポイントを集めてください;)
ralphtheninja

@MagnusSkog私はそれがうまくいくかどうか確信がなかったので、チェックするためだけにコメントをしました。確実に機能するようになったので、答えとして書き留めました:)
CarlosCampderrós12年

2
一般的なヒントとして、「機能しませんでした」はあまり役に立ちません。うまくいかなかった理由を教えてください。理想的にはエラー出力(非常に長い場合は削除されます)が理想的です。
me_and

回答:


154

リビジョンとパスの間に「-」を追加してみてください:

git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/ 

また、以前のコミットからディレクトリを回復したい場合は、コミットハッシュをHEAD〜1に置き換えることができます。次に例を示します。

git checkout HEAD~1 -- path/to/the/folder/ 

同じコマンド、ほとんど別の目的:stackoverflow.com/questions/953481/...
cregox

18
ただし、1つの問題があります。OPは、ディレクトリがまだ存在するかどうかを指定しません。既存のディレクトリをコミットの状態に復元するには、まずディレクトリのコンテンツを削除する必要があります。それ以外の場合、古いコミットに存在しなかった既存のファイルは削除されません。
アルベルト

7
+1 @Albertoは間違いなく同意します。私はrm -Rf path/to/the/folderそのときgit checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/-結果:そのパスには、そのコミットとまったく同じファイルがあり、違いはなく、このコミット後に作成された余分なファイルはありませんでした。それが私が欲しいものです。
therobyouknow

2
何をし--ますか?
Ray Foss

2
@RayFossは、次のパラメーターがファイルであることをgitに伝えます(それ以外の場合は、コミットハッシュやブランチなどと混同される可能性があります)。通常は必要ありませんが、配置しても害はありません
CarlosCampderrós

2

これを行うには、2つの簡単な方法があります。

エラーを含むコミットにエラーのみが含まれる場合は、git revertしてその影響を反転させます。

そうでない場合、簡単なパスは次のとおりです。

  1. git checkout 348…
  2. cp -a path/to/the/folder ../tmp-restore-folder
  3. git checkout HEAD # or whatever
  4. rm -rf path/to/the/folder
  5. mv ../tmp-restore-folder path/to/the/folder
  6. git add path/to/the/folder
  7. git commit -m "revert …"

1

単純に行うgit checkout <SHA-ID>と、一時的にそのsha-commitに移動します。

各コミットオブジェクトは、その時点でのディスクの構造全体を保持しているため、そこにファイルがあり、それらをコピーする必要がある場合は、そうすることができます。警告:ただし、どのブランチにも属さないため、ファイルを作業ツリーにコピーしてコミットする前に、マスターに戻る必要があります。


「マスターに戻る」とは、チェックアウトマスターを意味しますか?
パセリエ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.