Показати лише поточну гілку в Git


356

Я спробував знайти для цього спеціальну команду Git, але не зміг її знайти. Чи є щось коротше чи швидше, ніж наступне?

git branch | awk '/\*/ { print $2; }'

1
Я думаю, що це найшвидший спосіб отримати поточну гілку
Eimantas


@ChandrayyaGK: Ні, тому що інше питання - це робити це з вашого IDE. (Багато відповідей призначені для використання в командному рядку, тому це варто переглянути, але це не належний дублікат, і ці відповіді, можливо, повинні бути перенесені сюди, якщо є такі, які додають значущого значення тому, що вже є тут.)
tripleee

3
@Torek - ось ще одне просте завдання, ускладнене Git.
jww

Верхня відповідь на посилання @ChandrayyaGK розміщена набагато повільніше, ніж ця!
Колм Бхандал

Відповіді:


659
$ git rev-parse --abbrev-ref HEAD
master

Це має працювати з Git 1.6.3 або новішою версією.


Не працює і для мене, з git-1.6.2.5. git rev-parse --abbrev-ref HEAD => --abbrev-ref 311172491a9a667f9321bdf1c4fe5e22cc6e2c08 (тобто rev-синтаксичний аналіз не приймає --abbrev-ref (не на сторінці людини))
JasonWoof

1
JasonWoof, працює для мене в 1.6.4.2, потрібно змінити журнал, щоб побачити, коли саме це сталося ;-)
Майкл Крелін - хакер

7
Наскільки я можу сказати з журналів Git, ця функція була об'єднана в 2009-04-20 і була випущена з версією 1.6.3.
граф

1
Я теж хотів би це зрозуміти. Як це насправді працює? Крім того, схоже, що --abbrev-ref не повертає нічого для будь-якого іншого аргументу. Це не може просто мати HEAD як аргумент.
Setafire

6
Зауважте, що якщо ви знаходитесь у відокремленому символічному довіднику (це може означати, що ви знаходитесь у гілці, але ви перевірили попередню команду), ця команда повернеться HEAD, не очікуєтьсяmaster
unifreak

129

У Git 1.8.1 ви можете використовувати команду git symbolic-ref за допомогою параметра "--short":

$ git symbolic-ref HEAD
refs/heads/develop
$ git symbolic-ref --short HEAD
develop

Дякую. Псевдонім створений.
Майкл Берр

7
Краще, ніж прийнята відповідь ІМО, адже вона працює на
репост

2
Отримання помилки fatal: ref HEAD is not a symbolic refпід час запуску цього тексту як частини збірки
TravisCI

не здавалося, що працює в GIT 1.9.1 `` `git версія 1.9.1 фатально: ref HEAD не є символічним переглядом` ``
Річард

Для мене працює: версія git 2.16.2.Windows.1
Tagc

59

З Git 2,22 (Q2 2019), ви будете мати більш простий підхід: git branch --show-current.

Див. Комісію 0ecb1fc (25 жовтня 2018) від Даніельса Умановскіса ( umanovskis) .
(Об'єднав Хуніо С Хамано - gitster- в комітті 3710f60 , 07 березня 2019 р.)

branch: ввести --show-currentваріант відображення

Коли буде зателефоновано з --show-current, git branchнадрукує поточну назву гілки та припинить.
Друкується лише власне ім'я без refs/heads.
У відокремленому стані HEAD нічого не виводиться.

Призначений як для створення сценаріїв, так і для інтерактивного / інформаційного використання.
На відміну від цього git branch --list, для отримання назви гілки не потрібна фільтрація.


15
Нарешті, додано те, що, здається, мало бути там із самого початку!
dtasev

27

Можливо, вас зацікавить вихід

git symbolic-ref HEAD

Зокрема, залежно від ваших потреб та плану, які ви можете зробити

basename $(git symbolic-ref HEAD)

або

git symbolic-ref HEAD | cut -d/ -f3-

а потім знову є .git/HEADфайл, який також може зацікавити вас.


2
Можна скоротити git rev-parse --symbolic-full-nameдо git symbolic-ref.
граф

1
Вам не потрібно використовувати basenameабо cut; використання BR=${BR#refs/heads/}(де BR - ім'я змінної, на якій ви зберегли вихід git symbolic-ref HEAD).
Якуб Нарубський

Якуб, звичайно, ні, за умови, що у вас є вихід у змінній.
Майкл Крелін - хакер

5
можна зробити git symbolic-ref --short HEADтакож
FAHAD Сіддікі

2
Це порушиться, якщо у назвах вашої гілки є косої риски ("завдання / foo", "особливість / смужка"). Купа моїх скриптів почала виходити з ладу, коли колеги вирішили, що
косої

13

З того, що я можу сказати, немає ніякого способу споконвічно показати лише поточну гілку в Git, тому я використовував:

git branch | grep '*'

3
Хоча це працює з GNU coreutils, grep '*'номінально це синтаксична помилка. Ви, мабуть, хочете git branch | sed -n 's/^\* //p'все одно. Або, власне, те, що в першу чергу розміщувала ОП, що означає те саме.
tripleee

@tripleee Ви можете мені просвітити, чому grep '*'номінально є синтаксична помилка?
JK ABC

1
@JKABC: Що означає @tripleee, це те, що '*'це регулярний вираз, і як таке воно недійсне. Можливо, ви хочете використовувати '[*]'(тобто символ *замість оператора "нуль або більше разів").
johndodo

2
@johndodo дякую за роз’яснення, зараз це має сенс для мене. Зазвичай я роблю цеgrep '\*'
JK ABC

2
можна вирізати лише назву гілки зgit branch | grep "*" | cut -d' ' -f2
Фахад Сиддікі

6

Я думаю, що це має бути швидким, і його можна використовувати з API Python:

git branch --contains HEAD
* master

4
Це не виводить поточну гілку. Він виводить список гілок, на які трапляється вказівка ​​на команду HEAD. І так, це може перекриватися, але це може призвести до непорозумінь. Створіть нову гілку, де ви є, і повторіть свою лінію: дві гілки. Питання задає " лише поточну галузь ".
RomainValeri

4

Я використовую

/etc/bash_completion.d/git

Він поставляється з Git і надає підказку з назвою гілки та завершення аргументу.


Як можна активувати цей рядок?
Олексій

У ubuntu $ source /etc//bash_completion.d/git-prompt файл може бути названий по-різному в різних системах. (Примітка. sourceКлючове слово те саме, що просто .(крапка) у bash.)
michael

1

Це не коротше, але воно стосується і відокремлених гілок:

git branch | awk -v FS=' ' '/\*/{print $NF}' | sed 's|[()]||g'

1

Для повноти, echo $(__git_ps1)принаймні, в Linux слід вказати назву поточної гілки, оточеної дужками.

Це може бути корисно в деяких сценаріях, оскільки це не команда Git (хоча в залежності від Git), зокрема для налаштування вашого командного рядка Bash для відображення поточної гілки .

Наприклад:

/mnt/c/git/ConsoleApp1 (test-branch)> echo $(__git_ps1)
(test-branch)
/mnt/c/git/ConsoleApp1 (test-branch)> git checkout master
Switched to branch 'master'
/mnt/c/git/ConsoleApp1 (master)> echo $(__git_ps1)
(master)
/mnt/c/git/ConsoleApp1 (master)> cd ..
/mnt/c/git> echo $(__git_ps1)

/mnt/c/git>

елемент є псевдонімом і повинен бути присутнім для інтерактивних скриптів оболонки. його, ймовірно, немає для будь-якого сценарію.
Олександр Стор

0

Хтось може вважати це корисним. Поточна гілка відображається позначкою *.git show-branch --current

host-78-65-229-191:idp-mobileid user-1$ git show-branch --current
! [CICD-1283-pipeline-in-shared-libraries] feat(CICD-1283): Use latest version of custom release plugin.
 * [master] Merge pull request #12 in CORES/idp-mobileid from feature/fix-schema-name to master
--
+  [CICD-1283-pipeline-in-shared-libraries] feat(CICD-1283): Use latest version of custom release plugin.
+  [CICD-1283-pipeline-in-shared-libraries^] feat(CICD-1283): Used the renamed AWS pipeline.
+  [CICD-1283-pipeline-in-shared-libraries~2] feat(CICD-1283): Point to feature branches of shared libraries.
-- [master] Merge pull request #12 in CORES/idp-mobileid from feature/fix-schema-name to master
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.