关于Git:Git – 查看已更改的文件,即使删除了更改


Git - see files that have been changed, even if the changes were removed

我有一个代码库,其中包含将近一千个文件。我在一个有未提交更改的本地分支机构工作。今天早些时候,我在一个文件中添加了一条error_log语句,它返回了一条非常有用的信息。我想我已经完成了,所以删除了日志,并将文件恢复到Git所关心的"未更改"状态。我需要把那个日志放回去,但我一辈子都记不起来它是哪个文件或函数的一部分。

是否有任何git命令可以向我显示已对其进行更改的文件列表,即使更改已被删除?


我不认为有一种方法可以在Git中完成它,但是我会按文件被修改的顺序递归地列出这些文件。因此,在Linux中,您应该能够执行如下操作

ls -ltrR

您可以这样找到文件。总比什么都没有好。


如果在任何时候,您向您的回购承诺了error_log行,那么该行的存在仍然存在于您的历史中,并且您可以用几种不同的方式恢复它。最直接的方法是在git log中简单地使用补丁输出,并且假设输出被传递到less寻呼机,那么您只需点击/并为该行输入一个regex:

1
2
3
git log -p
# While in `less`
/error_log

然后,您可以通过点击n前进到下一个点击,或者点击n返回到最后一个点击,来搜索regex的输出。

另一种方法是使用-S-G选项来发现该行的存在(假设已承诺)。前者使用固定字符串搜索文本的添加或删除,后者也使用正则表达式:

1
2
3
4
5
# Fixed string
git log --name-status -S"error_log"

# Regex
git log --name-status -G"error_log"

输出将是在某个时间点添加或删除字符串error_log的文件列表。


扩展约翰尼的答案,并借用如何递归地查找和列出子目录和时间目录中最新修改的文件?:

1
2
find . -path './.git' -prune -o -type f -print \
    -exec stat --format '%Y :%y %n' {} \; | sort -nr | cut -d: -f2- | head

从repo根目录运行时,将显示最近修改的文件。


未提交的更改总是不好的。你应该总是小步工作,并且在完成每一步之后提交。-提交仅在本地进行,稍后可以在没有任何问题的情况下进行压缩。

通过小的承诺步骤,您可以一直返回到每一步。-如果没有任何提交,git就无法帮助您恢复更改。

因此,你必须从Git的外部寻找。比如文件系统的时间戳或者编辑器的一些日志。