Git的两个不常用技巧

git clone 可以更快一点

群里俩同事聊天,说现在的git 库太大,1年的历史都在,clone很费事.

chat

git clone--depth参数决定要获得多少个最近的commit. 你可以拿到最新文件,同时只保留一个commit. 和新建个git repo的效果是一样的。当然,你本地repo的内容是不全的(你只有一个commit)

git clone --depth 1

git 的 grep 功能很强大

git grep命令

是用git grep查找当前git库管理的文件,grep默认搜索所有文件,比如.git 下的二进制文件。需要用grep -v或者grep --exclude来排除这些结果,总之挺麻烦的. ack挺好用,但是windows下没有啊。 git grep可是在哪儿都好用,而且功能强大. 自己常用的两个场景:

  • 支持复杂的bool操作, --and, --or, --not, ( ... )--or是默认操作,--and操作的优先级高于--or-e是必需的前缀, --and 的条件是出现在同一行,不需要有前后关系,比如下面的表达式:
git grep \( -e 'include' --and -e'Factory' \) --or -e 'extend' --and \( -e 'Specification' -e 'Factory' \)
  • 使用参数--all-match可以搜索同一个文件中不同行出现的匹配. 下面的命令是列出所有包含great和func的文件(不一定同行)
git grep --all-match -e 'great' -e 'func'

git log –grep

  • 搜索commit message的内容, 比如说搜索提到func1或者func2的commit.
git log --grep=func1 --grep=func2 --since=1.month
  • 搜索同时提到func1和fun2的commit. --all-match的意思是两个条件必须同时满足
git log --grep=func1 --grep=func2 --since=1.month --all-match #--all-match:多个grep条件必须同时满足

git log -G|-S

如果你想查找在某个commit里增加或者删除的内容怎么办?这其实是个很常见的情景,比如我曾经写过过一个函数greatFunc,我都不知道在哪个commit删掉的。

git log -G'greatFunc'

-G-S的区别相当微妙,-G只关心含有匹配内容的文本是否有增删,-S则会进一步分析匹配内容的count是否有变化,

如果你的改动是:

+ return !regexec(regexp, two->ptr, 1, &regmatch, 0);
- hit = !regexec(regexp, mf2.ptr, 1, &regmatch, 0);

git log -G"regexec\(regexp" 会匹配, git log -S"regexec\(regexp" --pickaxe-regex 不会匹配,因为regexec(regexp的出现次数没变化。

 

欢迎下载魔幻工厂app, 需要的找我要红包^_^

wanna_qq_yyb

发表评论

电子邮件地址不会被公开。 必填项已用*标注