web-dev-qa-db-ja.com

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

数週間前に行った古いコミットがあります。そのコミットから単一のファイルのみを復元したい。私は何をしますか?

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

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

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

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

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

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

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

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

他の多くの方法があります。しかし、これは覚えやすいシンプルなものです。お役に立てば幸いです。

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

5

すべての回答にはgit checkout <tree-ish> -- <pathspec>が記載されています。 git v2.23.0の時点で、git checkoutが担当していたものの一部を想定する新しい git restore メソッドがあります。 github blog の変更点のハイライトをご覧ください。

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

コミットハッシュがabcdefであると仮定すると、コマンドは次のようになります。

git restore --source=abcdef file_name

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

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

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

git restore -s=abcdef -W -S file_name
0
mjarosie