获取HEAD最后指向的引用名称的最有效方法是什么?

时间:2014-09-02 14:01:58

标签: git awk branch reflog

在移动HEAD的操作(例如checkoutreset等)之后,您始终可以获得HEAD在该操作之前指向的提交ID例如,通过运行

git rev-parse @{1}

我感兴趣的是获取HEAD最后指向的引用(如果有)的名称。这是一个说明我想要的例子。让我们说我的回购看起来如下:

enter image description here

然后我通过运行

检查develop分支
git checkout develop

并以

结束

enter image description here

如何在最后一次结帐操作之前从HEAD指向master的我的回购内脏中检索信息?

This answer建议使用awk作为可能性从reflog中提取名称;例如,

git reflog -1 | awk '{ print $6; exit }'

(感谢EdEtan提出建议)。

据我所知,这很有效。它甚至会打印上一次提交的SHA,以防在最后一次检出之前分离HEAD

然而,OP引起了对his comment中的健壮性和向后兼容性的担忧:

  

我认为这个答案是正确的(在技术上是这样),因为缺乏更清洁的方法。但是,我不相信字符串格式被硬编码到Git的源代码中是一件好事,因为它意味着它可能会意外中断(即在Git的更高版本中)。

OP的担忧是否合法?最有效的方法是什么?

2 个答案:

答案 0 :(得分:2)

在一些快速测试中,这似乎运作得相当好(虽然测试完全没有彻底或强调奇怪的场景):

git rev-parse --symbolic-full-name @{-1}

我正在发表评论@ EmilDavtyan的回答说多重问题是有问题的,因为我不认为git关心(并没有跟踪) HEAD参考的最后一个位置,但后来我记得@{-1}如果它无法处理这种情况会如何使用它,所以在快速测试之后它似乎以某种方式(它可能很好地解析了我所知道的所有reflog中的消息。)

我还应该指出,链接的OP是正确的,手动解析reflog是不可靠的。事实上,当我在这里测试awk片段时,我没有得到正确的结果。事实证明,这是因为默认情况下我--decorate打开,这是用额外的字段填充行并抛弃计数。

答案 1 :(得分:1)

我会用:

git branch --contains HEAD@{1}

它将为您提供包含先前检出的提交的分支。


使用@ Etan的答案做了一点测试,我不认为它正在解析git reflog中的消息,它只是查找它的分支:

emil ~ git checkout -b temp2
Switched to a new branch 'temp2'
emil ~ git rev-parse --symbolic-full-name @{-1}
refs/heads/temp
emil ~ git branch -d temp
Deleted branch temp (was f3163f9).
emil ~ git rev-parse --symbolic-full-name @{-1}
@{-1}
fatal: ambiguous argument '@{-1}': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

因此,如果通过提交删除或更改分支,我认为该方法将失败。