我记得我在某个分支上提交时做了一些更改,但我找不到哪一个。我的提交意见应该更加认真。
所以我正在寻找我第一次做出
s/foo/bar/
等特定变更的地点/时间。
幸运的是,我知道要搜索什么来查找此提交,我可以使用git grep
,如下所示:
git rev-list branch | xargs git grep --count --perl-regexp bar > changeset
糟糕的是,在我要找的那个之后,我将获得所有提交的名称。
为了缩小直到提交更改的提交,我发现了这个丑陋的解决方案:
cat changeset | \
perl -ne 'print "$1\n" if /^(.*?):/' | \
sort -u | \
perl -ne 'print qx{git show -s --format=%ci $_} =~ s/\n//gr, " $_"' | \
sort -u | \
head -n1
这给了我正在寻找的提交:
2015-05-08 13:16:10 +0200 957d6d1c765862c8969230f8c6be4b663bcf7f01
有更好的方法吗?
答案 0 :(得分:3)
您提到您至少知道在所需提交中创建/修改的一个文件
所以我正在寻找我第一次进行特定更改的地方/时间,例如s / foo / bar /
您可以执行以下任何操作来查找所需的提交
git bisect
git bisect将“循环”在给定范围内的所有提交中,您可以将其与-run
标志一起使用以自动执行查找过程。
使用git bisect --run
时,您指定的脚本将“搜索”您想要查找的内容。
Here您可以克隆一个简单的git存储库,按照说明操作,您将在几分钟内学习什么是git bisect
。
git log --follow <file>
--follow
您在历史记录日志中搜索的文件。
如果文件重命名,使用--follow
标记也会跟踪文件以及所有旧名称。
这将打印出包含所需文件的提交列表。
使用更多标记来更好地过滤结果(例如-m
用于合并 - 因为它是从另一个分支合并,--stat
以“跟踪”更改等等)
git log -- file1 file2 ...
您可以在日志命令之后使用特殊--follow
(2个破折号)跟踪文件bu,而不是使用--
标志,并提供包含该文件的所需提交列表。再次使用更多标志来使您的输出更好
git log --stat --decorate --graph -- file1 file2 ...