git - git 分支引用中的 `..` 是什么意思?

标签 git

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

与上面的具体区别是什么?我试图了解 .. 究竟是什么|符号。我认为这是一个范围,但在这种情况下,它做了一些不同的事情。

最佳答案

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”。

只是为了额外的 super 骗子混淆,还有一个符号“A...B”。所以记得数点点数!在 A 和 B 处于同一修订行的情况下,没有真正的区别。但是“A...B”的意思是 A 或 B 中的修订版本不在 A 和 B 的任何 merge 基础中。因此,如果 A 和 B 在不同的分支上,它会显示在任一分支上所做的所有提交因为他们分道扬镳了。

修订范围的“长格式”(“B --not A”)允许您指定诸如“本地分支上不在任何远程跟踪分支上的所有修订”(“--branches --not -- Remote ”)。这个参数列表被许多 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 - git 分支引用中的 `..` 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/850607/

相关文章:

ios终端github端口443。操作超时

git - 在子目录中 merge git 存储库

svn - git svn : password for svn is not stored

Git - 我可以从命令行确定 fork repo 的来源吗?

windows - 如何让 Windows 上的 Git 忽略符号链接(symbolic link)

git - CodeDeploy 是否会忽略 .gitignore 中列出的文件?

git - 我可以使用 Git 将更新补丁应用于定制软件吗?

git - 从 teamcity buildstep 运行 git 命令

git - Gerrit 作为审查工具,而不是记录存储库

git 提交目录