gitの古いコミットからファイルを復元する


回答:


218
git checkout 'master@{7 days ago}' -- path/to/file.txt

これはHEADを変更せず、ローカルファイルを上書きするだけです。 path/to/file.txt

そこで可能なリビジョン仕様については、man git-rev-parseを参照してください(もちろん、(のようなdd9bacb)単純なハッシュはうまく機能します)

変更をコミットすることを忘れないでください(レビュー後...)


15
うわー、@ heneryvilleとsehe、私は実際には「7日前」がメタであり、どのようなコミットが行われるかを理解できると思いました。ty!
AnneTheAgile 14

7
パート2特定のコミットを選択する場合、上記のフォーマットは機能しません。パス/に/ file.txtはあたり-その代わりウルスは、以下のgitのチェックアウトcommitShaNumber示したものを使用stackoverflow.com/questions/215718/...
AnneTheAgile

2
@AnneTheAgile実際にはこれはまったく同じ構文revision-specificationですが、OPが尋ねたので、たまたま「複雑な」例を示しました:)
sehe

1
コミットを使用して、回復しようとしているファイルを削除した場合は、shacommit~1(ex:)を使用してgit checkout 0f4bbdcd~1 -- path/to/file.txt直前にコミットを取得します。
sdlins

89
  1. 古いコミットのファイルをからチェックアウトしますgit checkout [Revision_Key] -- path/to/file
  2. 必要に応じて、追加、コミット、プッシュします。

3
git checkout単一のファイルを処理でき(seheによる回答を参照)、コピーして貼り付ける必要はありません。
Koraktor 2011

1
リビジョンキーは常にコミットのSHA1ですか?
IslandCow、2011

1
それらは通常ですが、SHA1の最初の6〜8文字でリビジョンを識別できます。
Urs Reupke、2011年

2
ノー@IslandCow、彼らはSHA1だけでなく、ブランチ、タグ、またはそれにポイントをコミットすることを他のもの、例えばすることができHEADORIG_HEADまたはと組み合わせたもののいずれか^/ ~/ @スタイルの表記。
Alois Mahdal、2014年

2
後でファイルを「追加」することになっていることを示しています。しかし、それは誤りです。ファイルはステージング領域に配置されません。すでに追加されています。
xApple 2016

8

gitにコミットされた最近のファイルを復元する必要がありました。繰り返しますが、別の視点を与えるには、次の2つのステップを実行してこれを行う必要があります。

  1. git log -3
    これは、最新の3つのコミットを示しています。コメントと作成者の名前を読んで、希望する正確なバージョンを絞り込みます。必要なコミットバージョンの長いコミットID(b6b94f2c19c456336d60b9409fb1e373036d3d71)を書き留めます。

  2. git checkout b6b94f2c19c456336d60b9409fb1e373036d3d71-myfile.java
    コミットするIDと復元するファイル名を渡します。二重ハイフンの前後にスペースがあることを確認してください。

それを行うには他にも多くの方法があります。しかし、これは私が覚えているより簡単なものです。お役に立てば幸いです。

注:プロジェクトのパス/フォルダー内にいる場合は、チェックアウトコマンドで完全なファイルのパスを入力する必要はありません。


史上最高のコメント。受け入れられた答えであるものは、フェッチする必要があるファイルが上流にプッシュされると想定しているため、このコマンドはローカルにのみ存在するファイルをフェッチ/復元します。
ot0

1
私のローカルgitリポジトリのルートフォルダーでこれを試してみました。それでも、ファイルへの相対パスを指定する必要がありました。-を指定するだけでは機能しませんでした。
user2784627

@ ot0いいえ、それはそれを想定していません。彼らはまったく同じ答えです。
マット

4

すべての回答は言及していgit checkout <tree-ish> -- <pathspec>ます。git v2.23.0以降、新しいgit復元メソッドがあり、これgit checkoutが原因の一部と見なされることになっています。githubブログで変更点のハイライトをご覧ください。

このコマンドのデフォルトの動作は、sourceパラメーター(この場合はコミットハッシュ)からのコンテンツで作業ツリーの状態を復元することです。

commitハッシュを想定すると、abcdefコマンドは次のようになります。

git restore --source=abcdef file_name

(デフォルトで)作業ツリーに配置します。変更を直接インデックスに入れて、すぐにコミットできるようにする場合:

git restore --source=abcdef --worktree --staged file_name

または短いオプション名:

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