【发布时间】:2016-10-26 12:39:02
【问题描述】:
在尝试了解 Appium 1.4 分支的 HEAD 和标签 v1.4.16 之间的区别时,我没有找到方法告诉 git diff 区分标签和分支。
据我了解,从 git diff 的角度来看,标签和分支都只是提交哈希的别名,不是吗?
我最终创建了指向分支头 (git checkout 1.4; git tag -a v1.4) 的标记“v1.4”,然后我可以执行git diff v1.4.16..v1.4 并查看我所追求的差异。
但这似乎有点奇怪,这是实现我需要的唯一方法吗?
【问题讨论】:
-
您也可以使用提交的 SHA-1 哈希值而不是标签。你有什么问题?
-
目前还不清楚您的问题的意图是什么。确实,在 Git 中,任何一个引用都只是简单地解析为特定的提交哈希。除了完整参考名称的拼写之外,虽然——
refs/heads/somebranch与refs/tags/sometag——intent 是不同的:分支名称旨在随着分支的发展随着时间的推移解析不同的提交,而标签名称旨在永远解析为同一个提交。但是,当您运行git diff时,它只需要立即解析名称,因此无需关心。 -
标签可以指向一个提交,但并非总是如此。一个分支 ref 指向一个提交。提交指向一棵树。在您的情况下,标签和分支都指向提交。因此,在您的情况下,标签和分支之间的差异是显示两个提交或两棵树之间的更改,或者基本上是两棵树中的特定 blob。您可以查看“Pro Git”中的“Git Internals”章节来了解 git 对象,例如 blob、tree、commit 和 tag。
-
@ElpieKay:标签确实可以指向任何东西(我这样做只是为了尝试一下——标签和带注释的标签可以指向任何对象)。但是,通常标记应该在此处解析为提交 ID。 Git 通常不会让您将分支名称设置为指向提交以外的其他内容(我也尝试过,就像一种折磨测试)。
-
@AmosShapira:
git rev-parse会将任何有效标识符转换为 Git 哈希。标识符可能需要特定类型的对象(例如,x^{tree}将x转换为树对象,如果需要则解包标签和提交,或者如果x无法解析为树则失败)。一般来说,你不需要这么花哨:只要输入名字(在这个例子中是x),Git 通常会做正确的事情。