Показать только текущую ветку в Git


356

Я пытался найти для этого специальную команду Git, но не смог ее найти. Есть ли что-нибудь короче или быстрее, чем следующее?

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

1
я думаю, что это самый быстрый способ получить текущую ветку
Eimantas


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

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

Верхний ответ на ссылку @ChandrayyaGK размещен гораздо медленнее, чем этот!
Colm Bhandal

Ответы:


660
$ 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-parse не принимает --abbrev-ref (также не на странице man))
JasonWoof

1
JasonWoof, работает на меня в 1.6.4.2, нужно внести изменения в журнал изменений, чтобы увидеть, когда именно это произошло ;-)
Майкл Крелин - хакер

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

1
Мне бы тоже очень хотелось это понять. Как это на самом деле работает? Кроме того, похоже, что --abbrev-ref ничего не возвращает ни для какого другого аргумента. Это не может просто иметь заголовок в качестве аргумента.
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
Лучше, чем принятый ответ IMO, потому что он работает на репо без
Jerome

2
Получение ошибки fatal: ref HEAD is not a symbolic refпри запуске этого как часть сборки
TravisCI

похоже, не работает в GIT 1.9.1 `` `git version 1.9.1 fatal: ref HEAD не является символическим
Ричард

У меня работает: git версия 2.16.2.windows.1
Tagc

59

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

Смотрите коммит 0ecb1fc (25 октября 2018 г.) Дэниелса Умановскиса ( umanovskis) .
(Слиты Junio C Hamano - gitster- в фиксации 3710f60 , 07 марта 2019)

branch: ввести --show-currentопцию отображения

Когда вызвано с --show-current, git branchнапечатает текущее имя ветви и завершится.
Только фактическое имя печатается, без refs/heads.
В отключенном состоянии HEAD ничего не выводится.

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


15
Наконец, то, что должно было быть с самого начала, было добавлено!
дтасев

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также
Фахад Сиддики

2
Это сломается, если у вас есть косые черты в именах веток («task / foo», «feature / bar»). Куча моих сборочных скриптов начала давать сбои, когда коллеги решили, что слэши - это круто ...
vacri

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
Фахад Сиддики

7

Я думаю, это должно быть быстро и может быть использовано с 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 File может называться по-разному в разных системах. (Примечание: sourceключевое слово такое же, как и просто .(точка) в bash.)
Майкл

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.