Ответ Марека R правильный, но немного неполный.
По сути, git name-rev
предлагает имя плюс некоторое относительное выражение, если необходимо, чтобы перейти от имени ккоммит, в то время как git describe
предлагает какое-то имя - обычно имя тега, но, возможно, какое-то другое имя - плюс некоторую дополнительную строку, если необходимо, это не особенно «относительно»: в некоторых случаях есть счетчик, но это не такполезно в качестве числа (й) в git name-rev
.Если git describe
не удалось использовать необработанное имя, оно добавляет g
и сокращенный идентификатор хеша:
$ git describe
v2.19.1-272-gf84b9b09d4
, но:
$ git name-rev HEAD
HEAD master
Если мы добавим --all
к аргументам git describe
, git describe
действительно использует имя ветви, но вывод отличается:
$ git describe --all
heads/master
В частности, было осторожно заметить, что он использовал имя ветви, так как если естьколлизия между именами ветвей и тегов - если есть и refs/tags/master
- только при синтаксическом анализе master
будет получен хеш-идентификатор, связанный с тегом, а не имя ветви.
Помимо них, git describe
может добавить -dirty
, если рабочее дерево не соответствует коммиту, и - начиная с Git 2.16.0 - может создать строку name:pathname
, чтобы дать вам выражение, которое присваивает имя конкретному хранимому BLOB-объекту:
$ git describe HEAD:Makefile
v2.19.0-237-ge3d4ff037d:Makefile
, что не то, чем git name-rev
может управлять.
Цели разные
Какая польза от [git name-rev
]?
Я никогда не видел, чтобы кто-нибудь использовал его сам, но смотри ниже.Давайте начнем с того, что git describe
: git describe
используется очень часто для создания полезных описаний конкретной сборки.Поскольку он по умолчанию использует только теги , его вывод относительно стабилен (хорошо, если мы предположим, что теги никогда не изменятся).Когда git describe
говорит v2.19.1-272-gf84b9b09d4
, мы знаем:
- фиксация происходит через некоторое время после
v2.19.1
- фактический хэш-идентификатор фиксации начинается с
f84b9b09d4