むかしむかし、自分のプロジェクトに取得したいファイルがありました。
問題は、いつ削除したか、どのパスにあったかがわからないことです。
このファイルが存在するときに、このファイルのコミットを見つけるにはどうすればよいですか?
むかしむかし、自分のプロジェクトに取得したいファイルがありました。
問題は、いつ削除したか、どのパスにあったかがわからないことです。
このファイルが存在するときに、このファイルのコミットを見つけるにはどうすればよいですか?
回答:
使用できる正確なパスがわからない場合
git log --all --full-history -- "**/thefile.*"
ファイルのパスがわかっている場合は、次のようにできます。
git log --all --full-history -- <path-to-file>
これにより、そのファイルを操作したすべてのブランチのコミットのリストが表示されます。次に、必要なファイルのバージョンを見つけて表示することができます...
git show <SHA> -- <path-to-file>
または、次のコマンドで作業コピーに復元します。
git checkout <SHA>^ -- <path-to-file>
^
チェックアウトを取得するキャレット記号()に注意してください特定されたものより前に<SHA>
ます。コミットの時点でファイルが削除されているため、削除されたファイルの内容を取得するには、以前のコミットを調べる必要があります。
git log -- <path>
は、ファイルが存在しなかったブランチにいる場合、何も出力しません。git log --all -- <path>
他のブランチで発生した変更を見逃さないように、常にを使用する必要があります。このコマンドgit log -- <path>
は、複数のブランチがあり、パスやブランチ(私のように)を忘れがちな場合は非常に危険な場合があり、他の開発者と作業する場合も危険です。
git checkout <SHA>^ -- <path-to-file>
(^記号に注意)する必要があります。<SHA>コミットの時点でファイルが削除されているため、削除されたファイルのコンテンツを取得するには、以前のコミットを確認する必要があります
削除されたファイルのリストを取得し、削除されたファイルの完全なパスをコピーします
git log --diff-filter=D --summary | grep delete
次のコマンドを実行して、そのコミットのコミットIDを見つけ、そのコミットIDをコピーします
git log --all -- FILEPATH
削除されたファイルの差分を表示
git show COMMIT_ID -- FILE_PATH
覚えておいてください、あなたが使用してファイルに出力を書き込むことができます>
ように
git show COMMIT_ID -- FILE_PATH > deleted.diff
unknown revision or path not in the working tree
。
git log --diff-filter=D --summary | grep -E 'delete|^commit\s+\S+'
git-grep-latest(){ result_path=$(git log --diff-filter=D --summary | grep $1 | head -1 | awk '{print $4;}'); latest_commit=$(git log --all -- $result_path | head -1 | awk '{print $2;}'); git show $latest_commit -- $result_path; }
そして今、あなただけ行うことができます:git-grep-latest some_text
linux pipes
できます-グーグル..あなたはそれが好きでしょう。
受け入れられた応答を編集できなかったため、ここに回答として追加し、
gitでファイルを復元するには、次を使用します(SHAの直後の '^'記号に注意してください)
git checkout <SHA>^ -- /path/to/file
<SHA>~1
引用符で囲む必要なしに同じように動作するはずです。
と呼ばれるファイルを回復したいとします MyFile
が、そのパス(またはその拡張子については)が不明であるとします。
予備:git rootにステップして混乱を避ける
重要なプロジェクトには、類似または同一の名前を持つ複数のディレクトリがある場合があります。
> cd <project-root>
完全なパスを見つける
git log --diff-filter = D --summary | grep削除| grep MyFile
delete mode 100644 full/path/to/MyFile.js
full/path/to/MyFile.js
探しているパスとファイルです。
そのファイルに影響を与えたすべてのコミットを特定する
git log --oneline --follow-full / path / to / MyFile.js
bd8374c Some helpful commit message
ba8d20e Another prior commit message affecting that file
cfea812 The first message for a commit in which that file appeared.
ファイルをチェックアウトする
最初にリストされたコミット(年代順では最後、ここではbd8374c)を選択すると、そのコミットで削除されたため、ファイルは見つかりません。
> git checkout bd8374c -- full/path/to/MyFile.js
`error: pathspec 'full/path/to/MyFile.js' did not match any file(s) known to git.`
前の(キャレットを追加する)コミットを選択するだけです。
> git checkout bd8374c^ -- full/path/to/MyFile.js
git log --diff-filter=D --summary | find "delete" | find "MyFile"
ハッシュを囲む引用符に注意してください、そしてSTEP3:git checkout "bd8374c^" -- full/path/to/MyFile.js
@アンバーが正解しました!もう1つ追加してください。ファイルの正確なパスがわからない場合は、ワイルドカードを使用できます。これでうまくいきました。
git log --all -- **/thefile.*
ビューアを使用してみてください。たとえばgitk
、履歴を参照して、覚えている半分のファイルを見つけることができます。(gitk --all
すべてのブランチで必要に応じて使用)
--all
オプションは、あなたの答えと受け入れられた答えの両方にとって重要です。
概要:
削除されたファイルの履歴でファイルのフルパスを検索します git log --diff-filter=D --summary | grep filename
削除される前にコミットからファイルを復元した
restore () {
filepath="$@"
last_commit=$(git log --all --full-history -- $filepath | grep commit | head -1 | awk '{print $2; exit}')
echo "Restoring file from commit before $last_commit"
git checkout $last_commit^ -- $filepath
}
restore my/file_path
これが私の解決策です:
git log --all --full-history --oneline -- <RELATIVE_FILE_PATH>
git checkout <COMMIT_SHA>^ -- <RELATIVE_FILE_PATH>