Answers:
如果您不知道确切的路径,可以使用
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>
当您位于文件从未存在的分支上时,@ PedroMorteRolo 将没有输出。您应该始终使用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-完整/路径/到/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
尝试使用其中一种查看器,例如,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