【发布时间】:2010-10-25 10:28:24
【问题描述】:
git log origin/master
git log origin/master..
与上面的确切区别是什么?我试图了解 .. 符号的确切作用。我以为它是一个范围,但在这种情况下,它做了一些不同的事情。
【问题讨论】:
标签: git
git log origin/master
git log origin/master..
与上面的确切区别是什么?我试图了解 .. 符号的确切作用。我以为它是一个范围,但在这种情况下,它做了一些不同的事情。
【问题讨论】:
标签: git
我认为这是一个范围。 “..”命令将向您显示原始/主最后一次提交与您正在处理的分支上的最后一次提交之间的提交。
也可以指定要比较的分支,放在..后面,这样就变成了
git log origin/master..<branch_name>
您还可以使用提交标识符来过滤输出,例如:
git log 663f4c..fec6b
试试git help log 看看其他选项:-)
【讨论】:
对于git log(以及所有其他采用类似参数集的 Git 命令),它是关于如何查找一系列修订的规范,是的。请记住,在 Git 的一般世界中,这意味着修订图的某个子图——对大多数人来说,它通常意味着列表中的一系列修订。 (如果你不做太多的分支,它也会在 Git 中简化)。
修订规范包含一组正面引用(起点)和负面引用(终止点)和附加过滤器(限制修订数量、grep 提交文本等)。 Git 从正面引用开始并回溯修订历史记录,当它遇到可从负面引用到达的修订时停止(不一定只是在它到达负面引用之一时)。
可能相当令人困惑的是,已经发展了各种速记符号,旨在使这一切更易于使用,但不知何故也设法混淆了——我不得不花很长时间弄清楚“master..maint”是什么"、"maint..master" 等表示以及何时使用。
当您只说“origin/master”时,这意味着“origin/master”是正面引用,没有负面引用。因此,Git 从 origin/master 开始,然后遍历所有可用的修订——您将获得 origin/master 的完整历史记录。
"origin/master.." 是 "origin/master..HEAD" 的简写,看起来有点像“从 origin/master 到 HEAD”的意思。它确实有效。它可以重写为“HEAD ^origin/master”或“HEAD --not origin/master”。在这种情况下,HEAD 是正引用,“origin/master”是负引用。因此,Git 从 HEAD 开始并遍历图形,直到遇到可从 origin/master 访问的修订。事实上,它很可能会遇到 origin/master 本身。请注意,所有引用都是包含性的——正引用本身是输出,而负引用不是(除非你给出 --boundary,然后它们被标记)。这意味着如果 HEAD 和 origin/master 是相同的版本,“origin/master..HEAD”不会输出任何内容。
因此,如果您在上游版本之上进行了几次本地提交,您就会遇到这种情况:
steve@monolith:~/src/git <master>$ git log --pretty=oneline --abbrev-commit --decorate -n 4
ea3107d (refs/heads/master) Add another dummy comment
869c260 Add dummy comment
6345d7a (refs/remotes/origin/master, refs/remotes/origin/HEAD) Merge branch 'maint'
be427d7 allow -t abbreviation for --track in git branch
现在“git log origin/master..”意味着 git 将从 HEAD (ea3107d) 开始,从 origin/master 无法访问,所以它会打印出来。然后它回到 HEAD 的父级 (869c260),它仍然不是,所以打印出来。然后下一个父节点是 6345d7a,是源/主节点,所以它停止了。
请注意,“git log ..origin/master”的作用相反——尝试从 origin/master 回到 HEAD。在这种情况下,它不会打印任何东西。但是,如果我检查了“origin/maint”,它会打印出 origin/master 上不在 origin/maint 上的修订:所以一般来说,尝试将“A..B”视为“B 中不存在的修订”在 A" 中,并记住省略 A 或 B 表示 "HEAD"。
为了额外的超级混淆,还有一个符号“A...B”。所以记得计算点的数量!在 A 和 B 处于同一修订版的情况下,没有真正的区别。但是“A...B”的意思是 A 或 B 中的修订不在 A 和 B 的任何合并基础中。因此,如果 A 和 B 位于不同的分支上,它会显示在任一分支上所做的所有提交因为他们分道扬镳。
修订范围的“长格式”(“B --not A”)允许您指定诸如“本地分支上不在任何远程跟踪分支上的所有修订”(“--branches --不是 --remotes")。这个参数列表由许多 Git 命令解析(“git rev-list”是核心命令),包括 gitk。因此,您可以执行“gitk --branches --not --remotes”以图形方式查看本地更改。
最后,对于超级混淆,“git diff”之类的命令接受相同类型的速记语法,但这并不意味着(完全)相同的东西。 git diff 实际上需要两个修订版并比较它们,这与范围不同——请记住,Git 中的修订版范围是一个子图,而不仅仅是一个列表。 “git diff A..B”等价于“git diff A B”。 “git diff A...B”的意思是“显示 B 偏离 A 后的变化”。令人困惑?只是一点点:例如,“git log A...B”和“git log B...A”意思相同,但“git diff A...B”和“git diff B...A” “不要。
【讨论】:
git log origin/master
就像(假命令):
git log INITIAL..origin/master
同时:
git log origin/master..
是:
git log origin/master..HEAD
【讨论】:
我自己记忆语义的助记方式...
我认为 'git log start..end' 的日期范围是 start 代表 历史的旧部分,而 end 用于最近的历史记录。但是,与日期范围不同的是,提交范围不是线性回溯,与实际时间无关,而是设置减法,即:
(commits reachable from "end") - (commits reachable from "start")
请记住,提交范围中的 开始(将被排除)表示一组一个或多个提交,而不是一个单一的提交。
实际上,它指的是在“开始”(不包括)和“结束”(包括)之间创建的所有提交。
【讨论】: