为何git log r1..r2与git log ^r1 r2执行结果存在差异?
问题原因
这不是Git的功能异常,也不是你对官方文档的理解存在偏差,问题出在Windows系统CMD命令行的转义规则上。
在Windows默认的CMD解释器中,^是内置的转义字符,作用是标记紧随其后的特殊字符为普通文本。当你直接执行git log ^r1 r2时,^会被CMD提前解析处理,根本不会作为参数的一部分传递给Git程序。你可以执行echo git log ^r1 r2自行验证,命令的输出结果里不会出现^符号,Git实际接收到的命令等价于git log r1 r2——该命令的作用是展示所有可从r1、r2两个提交追溯到的历史提交,自然会返回从仓库初始提交开始的全量记录,和你观察到的现象完全吻合。
Git官方文档描述的等价规则是完全准确的:只要Git能正确接收到^r1参数,git log r1..r2和git log ^r1 r2的执行效果没有任何区别。如果要在CMD环境下正确使用脱字符写法,你可以选择以下两种适配方式:
- 给带脱字符的参数加上双引号,避免被CMD转义:
git log "^r1" r2 - 写两个脱字符对转义符本身做转义,处理后会留下单个脱字符传给Git:
git log ^^r1 r2
如果你换用Git Bash、PowerShell这类不把^作为默认转义字符的终端环境,直接执行git log ^r1 r2就能得到和双点范围写法完全一致的结果,不需要额外做转义处理。
内容的提问来源于stack exchange,提问作者Rob Benton
相关产品推荐
相关产品推荐

