首页 > 解决方案 > 在 Git 中获取当前签出的完整参考名称

问题描述

我需要一个命令来返回我当前签出的修订的完整参考名称。或者尽可能接近这个。如果仅 git(用于跨平台目的),则大加。

“完整的参考名称”是指例如refs/tags/my-tag, refs/heads/my-branch.

例子:

git checkout master
magic command
# => /refs/heads/master

git checkout v1.0.0
magic command
# => /refs/tags/v1.0.0

git checkout 86742545e8152a8fbf31eafa55eb573042f61f5d
magic command
# => 

几点参考:

有关的:

对于我正在寻找的东西,我能找到的一切似乎都太复杂了。

标签: git

解决方案


您可能想要git describe,也许带有一些标志,也许带有一些后处理。请参阅下面的详细信息。


我不完全确定您要解决的实际问题是:

  • 哈希 ID 是提交的永久名称。就这样git rev-parse HEAD,你就拥有了。

  • 当前的分支名称就是git symbolic-ref HEAD得到的。如果没有当前分支名称,则会产生错误,每当您使用git checkout切换到分离的 HEAD时都会出现这种情况。那包含着:

    • 检出非分支名称(例如,标签名称或远程跟踪名称),
    • --detach与分支名称一起使用,并且
    • 使用原始哈希 ID(当然)。

请注意,分支名称存储一个提交哈希 ID,除了在“未出生分支”上的一些特殊情况,在这种情况下,分支名称不存在,即使它是当前分支名称。这种有点令人讨厌的状态是必要的,因为分支名称必须包含现有提交的哈希 ID,并且在一个新的、完全空的存储库中,没有现有的提交,但您开始使用 branch master

如果您要解决的问题是:“告诉我用户输入了什么命令以进入HEAD我现在所处的状态,无论是分离的还是附加的”, Git不会为您保存。您得到的最接近的是HEADreflog 中的条目。此 reflog 不需要存在。另一个需要查看的地方是shell(命令行解释器)保存的历史记录:如果该历史记录存在,它可能包含用户输入的确切命令,即使该命令是别名。

如果您要解决的问题是:“提供一个对人类有用/可读的名称,这将(总是|当前)识别这个确切的提交”,那么没有正确的答案,但您最接近的方法是让您的拥有当前提交哈希 ID 的新标签。您可以来的第二个最接近的方法,它非常有用,是使用git describe(它有很多标志来调整其输出)的输出。请注意,使用分支名称只会识别相同的提交,直到分支名称继续识别其他提交,这会定期发生。


推荐阅读