1

私はgitにプロジェクトを持っています。私のプロジェクトには次のようなファイルがあります。

file1.js
file2.html
file3.js
file4.css
file5.html
file6.jpg
file7.html
file8.js
file9.css

すべてのファイルに対して git -rm filename を実行し、それらをコミットしました。

file1.js
file2.html

file6.jpg を取り戻す必要があります

私のレポが持っているようにfile6.jpgを取得するにはどうすればよいですか

file1.js
file2.html
file6.jpg
4

4 に答える 4

2
git checkout HEAD~N -- file6.jpg

N存在していた時点でのコミットの数はどこfile6.jpgにありますか。

于 2013-04-05T19:04:07.960 に答える
1

git checkout単一のファイルの最も簡単なオプションかもしれません。

  1. git logコミット履歴を表示するために使用します。問題のファイルを削除するに、コミットのハッシュを見つけます。例えば:

    commit 5faff7e3f74c3408985acecd1dbb90feeb7b1d75 <--- "hash"
    Author: Nick Tomlin <myemail@email.com>
    Date:   Fri Apr 5 11:34:03 2013 -0500
    
  2. 次に、上記の文字列にgit checkout <hash> path/to/file6.jpg置き換え<hash>て実行します (通常は最後の 5 かそこらしか必要ありませんが、安全のためにすべて使用しましょう。file6.jpg常駐するディレクトリにいる場合は、次のように実行できます。git checkout <hash> file6.jpg

これはコミットにアクセスするためのより長い形式のアプローチであり、単に を使用することもできますHEAD~6が、私は通常、HEAD~3. 相対参照を使用して間違ったコミットを参照する方が簡単です~.ログを調べて、とにかく必要なコミットを正確に把握します:)。

于 2013-04-05T19:03:48.520 に答える
0
git checkout $(git log -1 --pretty='%h' -- <path>)^ -- <path>

壊す

git log目的のファイルに影響を与える最後のコミットを見つけるために使用します

$(git log -1 --pretty='%h' -- <path>)

  • ハッシュのみを表示するフォーマットをgit log使用してコマンドを実行します。--pretty
  • 区切り記号を使用して--、コミット参照ではなくファイルを明示的に指定します。
  • 取得するファイルのパスとファイル名が続きます。
  • これをすべてラップして$()、変数のような別の git コマンドに埋め込むことができます。
  • これは、指定されたファイルが削除されたコミットを返します。

$()もちろん、そのファイルがいつ削除されたかを知りたい場合は、これを単独で使用できます。きれいなフォーマットを変更または削除すると、見つかったコミットに関する詳細情報が得られます。

git checkout特定のコミットにあったファイルを取得するために使用する

git checkout <ref>^ -- <path>

  • git checkoutコミットを使用し、パスを指定して実行します。
  • パスが指定されると、git は指定された参照でそのパスの状態を単純に再作成します。
  • ニンジン^を参照に追加することで、実際には直接の祖先を指します。
  • ログから取得したコミットにはファイルがないため、直接の祖先が必要です-ファイルが削除されたコミットであるためです。

すべてをまとめると、ファイルが削除される直前のコミットの状態でファイルをチェックアウトしています。削除されていないファイルに対してこれを実行すると、そのファイルに対して最後に行われた変更が元に戻されます。

エイリアス

git config --global alias.unrm '!COMMIT=$(git log -1 --pretty='%h' -- "$1"); git checkout $COMMIT^ -- "$1"'

unrmun-remove のように、これから というエイリアスを作成しました。上記のコマンドを実行すると、それ以降は実行するだけで済みます。

git unrm <path>

編集:コマンドにフィードバックを追加しました。

git config --global alias.unrm '!COMMIT=$(git log -1 --pretty='%h' -- "$1"); git checkout $COMMIT^ -- "$1"; echo "File: $1, was restored from commit $COMMIT"; git show -s $COMMIT'

これで、実行した内容が通知され、ファイルの復元元のコミットが表示されます。

于 2013-04-06T00:16:32.113 に答える
-1

file6.jpg が以前にコミットされていると仮定すると、次の方法で、git リポジトリ内の file6.jpg のすべてのリビジョンを取得できます。

git rev-list --objects --all | grep file6.jpg

次に、次を使用してファイルを復元できます

git cat-file {sha} > file6.jpg

ファイルを追加してコミットします。

git リポジトリからすべてのオブジェクトを取得する方法について説明しているこの回答も参照してください: https://stackoverflow.com/a/7350019

git オブジェクトの内部に関するこのサイト: http://git-scm.com/book/en/Git-Internals-Git-Objects

于 2013-04-05T19:05:42.150 に答える