在移动HEAD
的操作(例如checkout
,reset
等)之后,您始终可以获得HEAD
在该操作之前指向的提交ID例如,通过运行
git rev-parse @{1}
我感兴趣的是获取HEAD
最后指向的引用(如果有)的名称。这是一个说明我想要的例子。让我们说我的回购看起来如下:
然后我通过运行
检查develop
分支
git checkout develop
并以
结束
如何在最后一次结帐操作之前从HEAD
指向master
的我的回购内脏中检索信息?
This answer建议使用awk
作为可能性从reflog中提取名称;例如,
git reflog -1 | awk '{ print $6; exit }'
据我所知,这很有效。它甚至会打印上一次提交的SHA,以防在最后一次检出之前分离HEAD
。
然而,OP引起了对his comment中的健壮性和向后兼容性的担忧:
我认为这个答案是正确的(在技术上是这样),因为缺乏更清洁的方法。但是,我不相信字符串格式被硬编码到Git的源代码中是一件好事,因为它意味着它可能会意外中断(即在Git的更高版本中)。
OP的担忧是否合法?最有效的方法是什么?
答案 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>...]'
因此,如果通过提交删除或更改分支,我认为该方法将失败。