Покажіть, на якому тезі git ви перебуваєте?


216

У мене виникають проблеми з тим, який тег наразі перевірено.

Коли я роблю:

git checkout tag1
git branch

Я, здається, не можу дізнатися, на якому тезі я. Це лише журнали:

* (no branch)
master

Чи можна дізнатися, які теги перевіряються? У наведеному вище прикладі це було б tag1.

Відповіді:


326

Редагувати : У Якуба Нарбського є більше git-fu. Наступна значно простіша команда прекрасно працює:

git describe --tags

(Або без, --tagsякщо ви перевірили помічений тег. Мій тег легкий, тому мені потрібні теги.)

оригінальна відповідь випливає:

git describe --exact-match --tags $(git log -n1 --pretty='%h')

У когось більше git-fu може бути більш елегантне рішення ...

Це використовує той факт, що git-logзвітує про журнал, починаючи з того, що ви перевірили. %hдрукує скорочений хеш. Потім git describe --exact-match --tagsзнаходить тег (полегшений або з примітками), який точно відповідає тому, що здійснюється.

$()Синтаксис вище , передбачає , що ви використовуєте Баш або аналогічний.


22
Просто використання git describeбуде показувати ім'я тегу, якщо ви точно перебуваєте на (анотований) тег, або <tag>-<n>-g<shortened sha-1>якщо ні, то звідки <n>кількість комітетів <tag>.
Якуб Нарбський

1
@Jakub - спасибі Я додав --exact-matchсвою відповідь за секунди до вашого коментаря. Приємно знати, що ви можете його видалити, і все одно отримуєте хорошу інформацію від нечітких даних.
bstpierre

Спасибі, саме це я шукав. Btw, навіть git-опис --exact-match (без - тегів) працює для мене.
грм

3
Використання git rev-parse HEAD- це краще рішення, ніж git log -n1 --pretty='%h'... але чому ви не можете просто написати HEAD(або нічого, як git describeза замовчуванням для HEAD)?
Якуб Нарбський

тільки Гайбруш ненавидить фарфор
vdegenne

71

Це працювало для мене git describe --tags --abbrev=0


2
Так. це працює, навіть якщо ви точно не на цьому тезі! :)
Мартін Музатко

13
Уххх. ... Якщо ви перевіряєте хеш три коміти після тегу, ви не "на цьому тезі". Він повідомляє вам останній тег перед або після комісії, що перевірився. Тож це неправильно.
ingyhere

Працює і в Windows :)
cowlinator

50

Показувати всі теги на поточній HEAD (або виконувати)

git tag --points-at HEAD

1
Зауважте, що ця команда не повідомляє про помилку в командному рядку, навіть якщо результат видається порожнім. Помилка? Він також повертає список, якщо в цьому місці є кілька тегів. Це найкраща відповідь, але сценаристи повинні бути обережними, пам’ятаючи про ці застереження.
ingyhere

Після коментаря @ ingyhere Так, це гарна інформація, що вона не має помилок, і людям потрібно відповідно обробляти результат. Але я б не назвав це помилкою. У моєму випадку "порожнє, якщо немає тегів", дійсне. В інших випадках хтось може зберегти його до змінної, а потім перевірити, чи вона порожня (посилання на інструкції bash)
driftcatcher

23

git describe- порцелянова команда, якої слід уникати:

http://git-blame.blogspot.com/2013/06/checking-current-branch-programatic.html

Натомість я використав:

git name-rev --tags --name-only $(git rev-parse HEAD)

11
Повертається "невизначено"
Незнайомець

4
Це виводить трейлінг ^0для комісій, які відповідають тегам (наприклад, для тегів, які 1.0він виводить 1.0^0). Чи є спосіб отримати тільки вихід Git 1.0, або я повинен використовувати sed для цього?
Даніель Серодіо

13
Лише кілька концептуальних нитиків: я думаю, ви перевернули значення порцеляни та сантехніки. Це нормально використовувати фарфор, він високого рівня і призначений для звичайного використання . Сантехніка є внутрішньою (як випливає з назви) і не рекомендується лише тому, що розробники git залишають за собою право змінювати свої аргументи та виводити без попередження. Тож ваша перша пропозиція насправді є трохи більш підходящою.
Лев Антунес

5
Пов'язана стаття говорить про те, щоб не використовувати "гілку гіт", оскільки вона не працює для цього випадку використання. Я не можу придумати жодної вагомої причини, щоб уникнути використання git description. Як каже Лео, "Порцелянові" команди - це команди, які, як правило, слід використовувати. Уникайте команд сантехніки, якщо ви дійсно не знаєте, що робите. "git description" чудово працює.
Денні

4
"Порцелянові" команди - це ті, що вам слід використовувати, а не ті, яких вам слід уникати. Це команди, вихід яких є машиночитабельним і не змінюватиметься у майбутніх версіях, тому на них можна покластись у сценаріях тощо. Не порцелянові команди, як правило, дають більш доступний для читання людський вихід, але він може змінюватися у майбутніх версіях, наприклад, щоб зробити його більше читабельна, не тому, що щось важливе насправді змінилося.
rjmunro

22

Коли ви перевіряєте тег, у вас з'являється те, що називається a "відокремлена голова" . Зазвичай GIT-HEAD фіксація - це вказівник на гілку, яку ви перевірили. Однак якщо ви перевірите щось, окрім місцевої гілки (наприклад, тег чи віддалену гілку), у вас є "відсторонена голова" - ви насправді не на жодній гілці. Не слід робити жодних зобов’язань, перебуваючи на відірваній голові.

Добре перевірити тег, якщо ви не хочете робити жодних змін. Якщо ви просто вивчаєте вміст файлів або хочете створити свій проект із тегу, добре git checkout my_tagпрацювати з файлами, доки ви не берете жодних зобов'язань . Якщо ви хочете почати змінювати файли, вам слід створити гілку на основі тегу:

$ git checkout -b my_tag_branch my_tag

створить нову гілку, яка називається my_tag_branchпочинаючи з my_tag. Можна безпечно вносити зміни в цю галузь.


1
Фантастична відповідь.
Панос Філіанос

9

git log --decorate

Це дозволить вам сказати, на які відкликання вказують поточні перевірені комісії.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.