【问题标题】:Can git log --decorate unambiguously tell me whether the HEAD is detached?git log --decorate 可以明确地告诉我 HEAD 是否分离?
【发布时间】:2014-10-13 02:16:06
【问题描述】:

我知道,用 Git 的说法,“分离的 HEAD”对应于符号引用 HEAD 未指向任何分支的状态。例如,我也知道git branch 会告诉我我是否处于 detached-HEAD 状态,例如

* (detached from 9a2ef02)
  master

或者不,例如

* master

但是,我想知道是否有办法让git log --decorate 的输出完全明确我是否处于分离HEAD 状态。这是一个解释我所说的“明确”的示例。

示例

假设我在master,我的历史如下所示:

4d860e9 (HEAD, master) Remove trailing whitespace
9a2ef02 Correct typo in header
f0badb5 Add to-do section to README

案例 1:明确的 detached-HEAD 状态

如果我跑步

git checkout 9a2ef02

那么git log --decorate --oneline的输出是

9a2ef02 (HEAD) Correct typo in header
f0badb5 Add to-do section to README

因为在此输出中HEAD 旁边没有列出任何分支引用,所以我确定我有一个分离的 HEAD。

案例2:是否分离HEAD状态?

但是,如果我运行

git checkout 4d860e9

那么HEAD不指向master,而是直接提交4d860e9master也指向;我有一个分离的头。但是,从git log --decorate --oneline的输出中无法判断,

4d860e9 (HEAD, master) Remove trailing whitespace
9a2ef02 Correct typo in header
f0badb5 Add to-do section to README

因为它和我在master时完全一样。

有没有办法通过一些git log 选项来消除这种歧义?我在git-log 手册页中没有找到方法...

【问题讨论】:

  • 答案必须是git log吗?有一些方法可以判断您是否处于分离的 HEAD 状态,例如使用 git symbolic-ref HEAD
  • @GregHewgill 是的,我知道git symbolic-ref,但我特别想问的是git log/git show
  • +1 表示图片
  • 这将在 Git 2.4(2015 年第二季度)中实现。见my answer below

标签: git git-log git-detached-head


【解决方案1】:

[编辑:从 Git 2.4 开始,好吧,请参阅 VonC's answer。以下文本适用于 Git 2.4 之前的版本。]

很遗憾,没有。我一直希望git log--decorate 使用我的HEAD= 语法。如果是这样,你会得到:

4d860e9 (HEAD, master) Remove trailing whitespace
9a2ef02 Correct typo in header
f0badb5 Add to-do section to README

当你把头夹在腋下时:


(来源:shutterstock.com

但你会得到这个:

4d860e9 (HEAD=master) Remove trailing whitespace
9a2ef02 Correct typo in header
f0badb5 Add to-do section to README

当你不在万圣节模式时。

【讨论】:

  • 关于信息,我询问了 Git 开发团队是否会认为这是邮件列表中的一个好功能:marc.info/?l=git&m=142412655130612&w=2
  • 您当时的回答是正确的,但我想更清楚地了解新的情况。请原谅我不接受您的回答。
  • @Jubobs:事情就是这样,软件正在积极变化。那好吧。 :-)
【解决方案2】:

在 Git 2.4+(2015 年第二季度)中,git log --decorate 将显示与 HEAD 关联的确切分支(或缺少分支,对于分离的 HEAD)。

commit 51ff0f2Junio C Hamano (gitster)

log: 用分支名称装饰HEAD

目前,日志装饰不指示签出哪个分支 以及HEAD是否分离。

当分支foo被签出时,将装饰的“HEAD, foo”部分更改为“HEAD -> foo”。这用于指示参考装饰(由间距帮助)以及它们的关系。

因此,没有任何“->”的“HEAD”现在表示分离的HEAD


这意味着the 2.4 release notes 现在包含以下向后兼容性警告

git log --decorate”(以及用户格式“--format=<string>”参数“git log”命令系列中使用的“%d”格式说明符)的输出用于列出“HEAD”,就像其他分支名称的提示,中间用逗号分隔。例如

$ git log --decorate -1 master
commit bdb0f6788fa5e3cacc4315e9ff318a27b2676ff4 (HEAD, master)
...

当 HEAD 引用分支的尖端时,此版本会稍微更新输出,该分支的名称也显示在输出中。
如上所示:

$ git log --decorate -1 master
commit bdb0f6788fa5e3cacc4315e9ff318a27b2676ff4 (HEAD -> master)
...

【讨论】:

  • 是的;这是一个值得欢迎的改进。我相信我在这玩过a (small) part :)
  • @Jubobs 干得好!我只是不明白为什么这个线程(comments.gmane.org/gmane.comp.version-control.git/263922)以“As of Git 2.3.0”开头? Git 2.3.0之前还好吗?
  • 我用词不当; Junio Hamano 也被这个措辞弄糊涂了。我的意思是:“我们现在是 Git 2.3.0,这个功能还没有实现。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-25
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
  • 2017-01-10
相关资源
最近更新 更多