我有一个包含近一千个文件的代码库。我在本地分支工作,未提交更改。今天早些时候,我error_log
在一个文件中添加了一条语句,该文件返回了一条非常有用的信息。我以为我已经完成了它,所以删除了日志,就 git 而言,将文件返回到“未更改”状态。我需要重新登录该日志,但我无法记住它是哪个文件或功能的一部分。
是否有任何 git 命令可以向我显示已对其进行更改的文件列表,即使更改已被删除?
我有一个包含近一千个文件的代码库。我在本地分支工作,未提交更改。今天早些时候,我error_log
在一个文件中添加了一条语句,该文件返回了一条非常有用的信息。我以为我已经完成了它,所以删除了日志,就 git 而言,将文件返回到“未更改”状态。我需要重新登录该日志,但我无法记住它是哪个文件或功能的一部分。
是否有任何 git 命令可以向我显示已对其进行更改的文件列表,即使更改已被删除?
我认为在 git 中没有办法做到这一点,但我会按照文件被修改的顺序递归地列出文件。所以在linux中你应该能够做类似的事情
ls -ltrR
您也许可以通过这种方式找到该文件。这总比没有好。
如果您在任何时间点将该error_log
行提交给您的回购,那么该行的存在仍然存在于您的历史记录中,您可以通过几种不同的方式恢复它。最直接的方法是在 中简单地使用补丁输出git log
,并假设输出被传递给less
寻呼机,然后您只需点击/
并输入该行的正则表达式:
git log -p
# While in `less`
/error_log
n
然后,您可以通过点击前进到下一个点击或N
返回到最后一个点击来搜索正则表达式的输出。
另一种查找该行是否存在的方法(假设它已提交)是使用-S
or-G
选项git log
。前者使用固定字符串搜索文本的添加或删除,而后者也使用正则表达式:
# Fixed string
git log --name-status -S "error_log"
# Regex
git log --name-status -G "error_log"
error_log
输出将是在某个时间点添加或删除字符串的文件列表。
扩展约翰尼的答案,并借用如何递归地查找和列出具有子目录和时间的目录中最新修改的文件?:
find . -path './.git' -prune -o -type f -print \
-exec stat --format '%Y :%y %n' {} \; | sort -nr | cut -d: -f2- | head
从 repo 根目录运行时,这将显示最近修改的文件。
未提交的更改总是不好的。您应该始终以小步骤工作,并在完成每个步骤后提交。- 提交只是本地的,以后可以毫无问题地被压扁。
通过小的承诺步骤,您始终可以返回每个步骤。- 如果没有任何提交,git 无法帮助您恢复更改。
因此,您必须在 git 之外寻找。比如文件系统的时间戳或者你的编辑器的一些日志。