【问题标题】:What does the `..` mean in git branch reference?git分支参考中的`..`是什么意思?
【发布时间】:2010-10-25 10:28:24
【问题描述】:
git log origin/master
git log origin/master..

与上面的确切区别是什么?我试图了解 .. 符号的确切作用。我以为它是一个范围,但在这种情况下,它做了一些不同的事情。

【问题讨论】:

    标签: git


    【解决方案1】:

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

    也可以指定要比较的分支,放在..后面,这样就变成了

    git log origin/master..<branch_name>
    

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

    git log 663f4c..fec6b
    

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

    【讨论】:

      【解决方案2】:

      对于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-rev-list(1) 手册页,其中解释了 .. 语法
      • 我想我实际上已经得出结论,即使 SourceSafe 也比 Git 更好。
      【解决方案3】:
      git log origin/master
      

      就像(假命令):

      git log INITIAL..origin/master
      

      同时:

      git log origin/master..
      

      是:

      git log origin/master..HEAD
      

      【讨论】:

      • 如果您正在寻找一个快速的答案,这是一个不错的、简短而甜蜜的答案,尽管显然 araqnid 的答案更加健壮和解释性强!
      • 我看不出 araqnid 的回答提供了什么价值。我的回答了所提出的问题。
      • 您的回答确实回答了这个问题,所以我投了赞成票。我也赞成 araqnid 的回答,因为它也回答了这个问题,但方式更完整。我很欣赏你的简单回答,但另一个更详细地解释了命令,这也很好。
      【解决方案4】:

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

      我认为 'git log start..end' 的日期范围是 start 代表 历史的旧部分,而 end 用于最近的历史记录。但是,与日期范围不同的是,提交范围不是线性回溯,与实际时间无关,而是设置减法,即:

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

      请记住,提交范围中的 开始(将被排除)表示一组一个或多个提交,而不是一个单一的提交。

      实际上,它指的是在“开始”(不包括)和“结束”(包括)之间创建的所有提交。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-27
        • 2015-03-02
        • 2019-09-09
        • 1970-01-01
        • 1970-01-01
        • 2021-12-26
        • 1970-01-01
        相关资源
        最近更新 更多