`..`在git branch参考中意味着什么?

时间:2009-05-12 00:09:46

标签: git

git log origin/master
git log origin/master..

与上述的确切区别是什么?我试图理解..符号的确切含义。我认为这是一个范围,但在这种情况下它会做一些不同的事情。

4 个答案:

答案 0 :(得分:48)

使用git log(以及所有其他Git命令采用类似的参数集),它是如何查找一系列修订的规范,是的。请记住,在Git的一般世界中,这意味着修订图的一些子图 - 对大多数人来说,它通常意味着列表中的一系列修订。 (如果你不做任何分支,那么它也会简化为Git)。

修订规范包含一组正参考(起始点)和负参考(停止点)和其他过滤器(限制修订数量,grep提交文本等)。 Git从正面引用开始并返回修订历史记录,当它遇到可以从否定引用访问的修订时停止(不一定只是当它到达其中一个否定引用本身时)。

可能相当令人困惑的是,有各种简化的符号已经发展,旨在使这一切都更容易使用,但不知何故也设法混淆 - 我不得不花费一段时间来弄清楚什么是“掌握......” “,”maint..master“等意味着何时使用哪个。

当你只说“origin / master”时,那意味着“origin / master”是一个正面的引用,并且没有负面的引用。所以Git从origin / master开始,然后返回所有可用的修订版本 - 您将获得源/主文件的完整历史记录。

“origin / master ..”是“origin / master..HEAD”的简写,看起来有点像“从origin / master到HEAD”。这有效。它可以改写为“HEAD ^ origin / master”或“HEAD - not origin / master”。在这种情况下,HEAD是正参考,“origin / master”是负参考。所以Git从HEAD开始,然后返回图表,直到它遇到可以从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上没有原点/ maint的修订:所以一般来说,试着将“A..B”想象为“B中的修订版”在A“中,记住省略A或B意味着”HEAD“。

只是因为额外的超级混乱,还有一个符号“A ... B”。所以记得要计算点数!在A和B处于一系列修订的情况下,没有真正的区别。但是“A ... B”的含义是A或B中的修订,它们不属于A和B的任何合并基础。因此,如果A和B位于不同的分支上,则显示所有提交的任何提交因为他们分歧了。

修订范围的“长形式”(“B - 不是A”)允许您指定诸如“不在任何远程跟踪分支上的本地分支上的所有修订”之类的内容(“ - 分支 - 不是--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 “不要。

答案 1 :(得分:22)

git log origin/master

就像(假命令):

git log INITIAL..origin/master

虽然:

git log origin/master..

时:

git log origin/master..HEAD

答案 2 :(得分:4)

我认为这是一个范围。 “..”命令将显示origin / master上次提交与您正在处理的分支上的最后一次提交之间的提交。

您也可以通过将它放在..之后指定要比较的分支,因此它将变为

git log origin/master..<branch_name>

您还可以使用提交标识符来过滤输出,例如:

git log 663f4c..fec6b

尝试git help log查看其他选项: - )

答案 3 :(得分:2)

我自己记忆语义的助记方法......

我认为'git log start..end'在日期范围方面,开始代表历史的旧部分结束对于更近的历史。但是,与日期范围不同,提交范围不是线性回溯,与实际时间无关,而是与集合相减,即:

(commits reachable from "end") - (commits reachable from "start")

请记住,提交范围中的 start (要排除)表示一组一个或多个提交,而不是一次提交。

实际上,它指的是在'start'(独占)和'end'(包括)之间创建的所有提交。