我希望我的命令行(PS1
变量(更优雅地显示分离的头部,即使它有点模棱两可。我想这样做的原因是,虽然我从不处理分离的分支,但由于我们的项目设置,我经常遇到它们,并且想知道它们来自哪个分支(或者至少是它们所在的分支(。
首先,我相信我对以下两者之间的区别有很好的理解:
- 主人的头部提交
- 一个分离的头部,恰好与
master
的头部相同
这就是这两个命令之间的区别:
git checkout master # Checkout the master branch
git checkout master~0 # Checkout the commit from the head of the master branch
现在进入问题。目前,我的PS1
末尾包含$(__git_ps1)
,命令行显示如下:
# git checkout master~1
addison:~/project ((111abcdef1...))$
# git checkout master~0
addison:~/project ((000abcdef0...))$
# git checkout master
addison:~/project (master)$
我想发生的是,如果我在一个分离的头上,能够找到一个具有匹配提交哈希的分支(首选master
(,并显示分支名称,以及提交HEAD
落后的距离,如下所示:
# git checkout master~1
addison:~/project (Detached(master~1))$
# git checkout master~0
addison:~/project (Detached(master))$
# git checkout master
addison:~/project (master)$
我知道可能还没有一个实用程序可以做到这一点,我已经准备好接受这一点 - 如果是这种情况,我想知道如何为提交哈希找到分支名称,以及分支HEAD
提交它有多差。我知道可能有多个分支具有具有相同哈希的提交 - 我只想要一个"尽力而为"的解决方案。这可能意味着只选择最新的,或者最接近HEAD的,等等。
使用此信息,我可以创建自己的脚本并将其嵌入到我的$PS1
变量中,并完全按照我想要的方式格式化它。
更新
我发现有一个选项可以用$(__git_ps1)
设置,它可以将输出的格式更改为我想要的格式:
GIT_PS1_DESCRIBE_STYLE=contains # git describe --contains HEAD
GIT_PS1_DESCRIBE_STYLE=branch # git describe --contains --all HEAD
GIT_PS1_DESCRIBE_STYLE=tag # git describe --tags HEAD
GIT_PS1_DESCRIBE_STYLE=describe # git describe HEAD
GIT_PS1_DESCRIBE_STYLE=default # git describe --tags --exact-match HEAD
如果我将选项设置为branch
,那么输出的可读性要高得多。
正如您所指出的,没有完美的解决方案。 Git 本身使用两种方法。 一个示例是git status
:当你在某个分支上时,HEAD
包含分支名称,当你分离时,HEAD
包含一个哈希 ID,但HEAD
的reflog仍然包含分支名称,Git 可以扫描它并挑选出最近的分支,看看你是在该提交还是它的后代之一,然后说detached atname
或detached fromname
。1
但是,在您的情况下,您可能想要更像git describe
所做的,只是按照不是git describe
默认值的顺序。 在这种情况下,你想要的更像是git describe --contains
所做的。--contains
选项意味着--tags
选项,该选项git describe
查看所有标记,但不查看任何分支名称。 幸运的是,您可以添加--all
:
git describe --contains --all
它查看标记和分支名称(以及其他引用,包括可能不是那么好的refs/stash
(,并选择其中一个来描述当前提交。 所以这可能是 Git 内置的最接近你想要的东西。
1此功能在某些非常旧的 Git 版本中没有。 我不确定它何时首次出现,发行说明仅在描述 Git 2.4.0 的修复时提到了它。 在 2.4.0 之前,git branch
和git status
在何时以及如何说"分离"与"分离"方面存在分歧。 所以它在 2.4 及更高版本中,但早期版本不太擅长它,在某些时候,"分离/从"的东西根本不存在。