如何获取引入PATTERN的提交名称?

时间:2015-05-27 07:54:41

标签: git

我记得我在某个分支上提交时做了一些更改,但我找不到哪一个。我的提交意见应该更加认真。

  

所以我正在寻找我第一次做出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

有更好的方法吗?

1 个答案:

答案 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 ...