问题是:我不知道我什么时候删除了它,也不知道它的路径在哪里。
当这个文件存在时,我该如何定位它的提交记录呢?
如果您不知道确切的路径,可以使用
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>
命令可能非常危险,如果你与其他开发人员一起工作也很危险。 - hobs**/thefile.*
时,通常最好加上引号,例如 '**/thefile.*'
,以保护 glob 中的 *
不被 shell 解析。(我不熟悉 Windows shell 是否会解析 *
,但如果在 bash 中从当前工作目录中意外匹配到,那可能会出现问题。) - torek获取已删除文件的列表,并复制已删除文件的完整路径。
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
git log --diff-filter=D --summary | grep -E 'delete|^commit\s+\S+'
。 - Chris Middletongit-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
- randomorMyFile
的文件,但对其路径(或扩展名)不确定:
一个复杂的项目可能有多个具有相似或相同文件名的目录。
> cd <project-root>
> git log --diff-filter=D --summary | grep delete | 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"
在第三步骤中,请注意引号包围哈希值:git checkout "bd8374c^" -- full/path/to/MyFile.js
- user5542121git log --diff-filter=D --summary | Select-String "delete" | Select-String "MyFile"
。 - Silverfish无法编辑已接受的响应,因此在此添加答案,
要在 git 中恢复文件,请使用以下命令(请注意 SHA 后面紧跟着 '^' 符号)
git checkout <SHA>^ -- /path/to/file
<SHA>~1
应该可以不用加引号就能起到相同的作用。 - CodeManX@Amber 给出了正确的答案!再补充一点,如果您不知道文件的确切路径,您可以使用通配符!这对我有用。
git log --all -- **/thefile.*
以下是一个简单的命令,开发人员或 Git 用户可以传递从存储库根目录中删除的文件名称并获取其历史记录:
git log --diff-filter=D --summary | grep filename | awk '{print $4; exit}' | xargs git log --all --
如果有人能改进这个命令,请务必进行修改。
尝试使用其中一个查看器,例如gitk
,这样您就可以浏览历史记录以查找半个被遗忘的文件。(如果需要所有分支,请使用 gitk --all
)
大小
以及相关的SHA
git log --all --stat --diff-filter=D --oneline
添加-p|--patch
选项可以查看内容
git log --all --stat --diff-filter=D -p
要缩小到任何文件,您有两个简单的选项,可以使用路径规范或管道到 grep 并搜索文件名。
使用 grep:
git log --all --stat --diff-filter=D --oneline | grep foo
git log --all --stat --diff-filter=D --oneline -- '*foo*'
-p|--patch
结合使用时,如果您想查看内容,则可以很好地发挥作用。git log --all --stat --diff-filter=D --oneline --patch -- '*foo*'
如果您知道文件的位置,您可能也会喜欢这个。
git log --all --full-history -- someFileName
简介:
在已删除文件的历史记录中搜索文件完整路径 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>