Как получить текущее название ветки в Git?


2595

Я из Subversion, и когда у меня была ветка, я знал, над чем я работал, «Эти рабочие файлы указывают на эту ветку».

Но с Git я не уверен, когда я редактирую файл в NetBeans или Notepad ++, привязан ли он к мастеру или другой ветке.

Там нет проблем с gitBash, он говорит мне, что я делаю.


11
Пусть ваша IDE отобразит файл .git/HEAD, возможно, в родительском каталоге
— Tino

101



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

Ответы:


2305
git branch

должны показать все локальные филиалы вашего репо. Помеченная ветвь - это ваша текущая ветка.

Если вы хотите получить только название филиала, в котором вы находитесь, вы можете сделать:

git rev-parse --abbrev-ref HEAD

Но это не помогает мне с Notepad ++ и Netbeans. Просто git bash (и, вероятно, Vim), и я упомянул это. Я пытаюсь работать с другими Ide и текстовыми редакторами, которые не являются командной строкой.
— mike628

@ mike628 На самом деле они помогают вам, за исключением того, что вы хотите что-то доступное через графический интерфейс. Правильный?
— Tadeck

2
Если вы готовы работать в Eclipse, есть программа под названием «eGit», которая имеет графический интерфейс, который сообщит вам текущую ветку для всех репозиториев в ней. В противном случае, я не знаю ... вы бы зависели от создателя любого плагина, который вы хотите использовать, который совместим с выбранной вами программой (если есть).
— roberttdev

2
после этого git checkout --orphan fooпотом git branchне удалось показать ветку foo. Принимая во внимание, git symbolic-ref HEADчто предложенный другой ответ работал.
— Маркус Юний Брут

2
downvote, мы хотим, чтобы только текущая ветвь в качестве stdout, а не все ветки
— Alexander Mills

4657

Чтобы отобразить текущую ветку, в которой вы находитесь, без других перечисленных веток, вы можете сделать следующее:

git rev-parse --abbrev-ref HEAD

Ссылка:


132
@ChrisNelson, потому что он отображает только текущую ветвь, а не длинный список всех ветвей.
— августа

73
Хороший, к сожалению, он не работает, если вы находитесь в состоянии «отключенный HEAD» (он просто выводит «HEAD», что совершенно бесполезно).
— Карлос Кампдеррос

34
Я предполагаю, что внутренними средствами git, если вы находитесь в состоянии «отсоединенного HEAD», нет отслеживания ветви, к которой он принадлежит, потому что git branchпоказывает * (no branch), что также бесполезно ...
— Карлос Кампдеррос

76
"git symbolic-ref --short HEAD" также работает для этой же цели
— dusktreader

22
git rev-parse --abbrev-ref HEAD 2>/dev/null Часть / dev / null предотвращает появление ошибки, если вы только что создали новый репозиторий, у которого еще нет HEAD.
— Paradiesstaub

523

У вас также есть, git symbolic-ref HEADкоторый отображает полный refspec.

Чтобы показать только имя ветки в Git v1.8 и более поздних версиях (спасибо Greg за это):

git symbolic-ref --short HEAD

На Git v1.7 + вы также можете сделать:

git rev-parse --abbrev-ref HEAD

Оба должны дать одно и то же имя ветви, если вы находитесь на ветви. Если у вас отстраненная голова, ответы отличаются.

Замечания:

На более раннем клиенте это работает:

git symbolic-ref HEAD | sed -e "s/^refs\/heads\///"

- Darien 26. март 2014


7
Как и все остальные ответы, это не работает, когда вы находитесь в состоянии «отсоединенная ГОЛОВА»
— Карлос Кампдеррос

51
@ CarlosCampderrós: ​​если вы находитесь в отключенном состоянии HEAD, нет такой вещи, как текущая ветвь. В конце концов, коммит, в котором вы находитесь, может быть доступен через ноль, одну или несколько веток.
— Flimm

2
это создает проблемы в пустых git-репозиториях, когда нет HEAD
— Arne

8
С git версии 2.4.4 git rev-parse --abbrev-ref HEADпоказывает, HEADкогда вы находитесь на отстраненной голове.
— Петерхил

Лучший ответ по-прежнему, git symbolic-ref HEAD | sed -e "s/^refs\/heads\///" поскольку он будет отображать строку, как HEAD detached at a63917fв отключенном состоянии, в отличие от других ответов, которые ничего не показывают или HEAD. Это важно.
— Бернард

265

Для моей собственной справки (но это может быть полезно для других) я сделал обзор большинства (основных командных строк) методов, упомянутых в этом потоке, каждый из которых применяется к нескольким случаям использования: HEAD is (указывает на):

  • местное отделение (мастер)
  • ветвь удаленного отслеживания, синхронизированная с локальной ветвью (источник / мастер на том же коммите, что и мастер)
  • ветка удаленного отслеживания, не синхронизированная с локальной веткой (origin / feature-foo)
  • тег (v1.2.3)
  • субмодуль (запустить внутри директории субмодуля)
  • общая оторванная голова (ничего из вышеперечисленного)

Результаты:

  • git branch | sed -n '/\* /s///p'
    • местное отделение: master
    • ветка удаленного отслеживания (синхронно): (detached from origin/master)
    • ветка удаленного отслеживания (не синхронизирована): (detached from origin/feature-foo)
    • тег: (detached from v1.2.3)
    • подмодуль: (HEAD detached at 285f294)
    • общая отстраненная голова: (detached from 285f294)
  • git status | head -1
    • местное отделение: # On branch master
    • ветка удаленного отслеживания (синхронно): # HEAD detached at origin/master
    • ветка удаленного отслеживания (не синхронизирована): # HEAD detached at origin/feature-foo
    • тег: # HEAD detached at v1.2.3
    • подмодуль: # HEAD detached at 285f294
    • общая отстраненная голова: # HEAD detached at 285f294
  • git describe --all
    • местное отделение: heads/master
    • ветка удаленного отслеживания (синхронно): heads/master(примечание: нет remotes/origin/master )
    • ветка удаленного отслеживания (не синхронизирована): remotes/origin/feature-foo
    • тег: v1.2.3
    • подмодуль: remotes/origin/HEAD
    • общая отстраненная голова: v1.0.6-5-g2393761
  • cat .git/HEAD:
    • местное отделение: ref: refs/heads/master
    • подмодуль: cat: .git/HEAD: Not a directory
    • все другие варианты использования: SHA соответствующего коммита
  • git rev-parse --abbrev-ref HEAD
    • местное отделение: master
    • все остальные варианты использования: HEAD
  • git symbolic-ref --short HEAD
    • местное отделение: master
    • все остальные варианты использования: fatal: ref HEAD is not a symbolic ref

(К вашему сведению, это было сделано с помощью git версии 1.8.3.1)


6
Таким образом, ни один из них не делает то, что я делал бы вручную.
— Букзор

6
Это было очень полезно для меня: git describe --all --exact-match 2>/dev/null | sed 's=.*/=='было лучшим решением для меня (хорошие имена для тегов и заголовков веток, нет выводов для случайных отсоединенных головок.
— Алекс Дюпюи

1
Тем не менее, я только что обнаружил, что использование git describeимеет серьезный сбой, когда несколько ветвей ссылаются на один и тот же коммит, например, сразу после этого git checkout -b foo- он использует одну из них произвольно (кажется, возможно, самой последней созданной). Я изменю свою стратегию, чтобы использовать отфильтрованный вывод из git branchи использовать только в том git describeслучае, если результат будет что-то о отсоединенной голове.
— Алекс Дюпюи

На самом деле, мне нужно использовать, git branch --no-colorчтобы убедиться, что в имени файла нет надоедливых кодов выхода терминала.
— Алекс Дюпюи

2
Это было действительно полезно для меня не раз, спасибо за такую ​​тщательность!
— Алиса Перселл,

154

Начиная с версии 2.22, вы можете просто использовать:

git branch --show-current

Согласно справочной странице:

Напечатайте название текущей ветви. В отключенном состоянии HEAD ничего не печатается.


2
Да, я упоминал об этом в марте прошлого года в комментариях к этой странице: stackoverflow.com/questions/6245570/… . И в stackoverflow.com/a/55088865/6309 .
— VonC

5
По крайней мере, упомяните, что это не работает в отключенном состоянии HEAD. Просто потерял часы, получая git 2.22 без компиляции ...
— David Deprost

136

Еще одна альтернатива:

git name-rev --name-only HEAD

это также может быть восстановлено сecho ${$(git symbolic-ref --quiet HEAD)#refs/heads/}
— Antoine

12
Это не работает, если HEAD одинаково для главной и функциональной ветвей (например, во время слияния). Он возвращает 'master', даже если выполняется в ветви функций.
— Орест Гера

1
git checkout master && git name-rev --name-only HEAD # ac-187Это не работает, как ожидалось
— Александр Абашкин

Я сохраняю это в переменную непосредственно перед слиянием, а также в случаях, когда мой HEAD может быть отсоединен, если я извлекаю конкретный коммит. В этом случае это работает нормально.
— Ишаан Сейвал

4
Я делаю это по трубопроводу Дженкинса. Так что, похоже, это лучший ответ для меня. Делать git branch --listпросто говорит * (HEAD detached at 7127db5). Делать git rev-parse --abbrev-ref HEADпросто говорит HEADи так далее.
— Mig82

91

Ну, достаточно просто, я получил его в один лайнер (Баш)

git branch | sed -n '/\* /s///p'

(кредит: ограниченное искупление)

И пока я там, один вкладыш, чтобы получить ветку удаленного отслеживания (если есть)

git rev-parse --symbolic-full-name --abbrev-ref @{u}

8
Слишком много косых черт! :) sed -n 's/\* //p'делает свое дело. Хотя я склоняюсь к параноику, поэтому я бы закрепил его sed -n 's/^\* //p'.
— Марк Рид

65

Вы можете просто набрать в командной строке (консоли) в Linux, в каталоге хранилища:

$ git status

и вы увидите некоторый текст, среди которого что-то похожее на:

...
On branch master
...

что означает, что вы в настоящее время на masterветке. Если вы редактируете какой-либо файл в тот момент, и он находится в том же локальном репозитории (локальный каталог, содержащий файлы, находящиеся под управлением контроля версий Git), вы редактируете файл в этой ветке.


2
Исходя из того, что вы хотите сделать, вы можете использовать git statusи получать только первую строку вывода, с git status | head -1которой получается что-то вроде # On branch master. Я уверен, что различия версий также должны быть учтены.
— Джошуа Пинтер

@JoshPinter: Вы также можете использовать git status | grep 'On branch', что должно иметь тот же эффект (если не означает, что так будет, если ваша версия Git отображает его по-другому). Или git branch | grep '*', который покажет название ветви со звездой в начале.
— Tadeck

Да, это работает также и может быть более гибким. Мой конечный результат для отображения только названия ветки в приложении dev Rails был:<tick>git status | head -1<tick>.gsub('# On branch ', '')
— Джошуа Пинтер

1
git statusможет потребоваться много времени, чтобы вернуть значение, если существует много файлов, управляемых.
— Жестянщик

Да, если вы хотите напечатать ветку на веб-странице, например, git statusможет сократить время генерации всей страницы.
— Артем Руссаковский

36
git symbolic-ref -q --short HEAD

Я использую это в сценариях, которым нужно текущее имя ветви. Он покажет вам текущую краткую символическую ссылку на HEAD, которая будет вашим текущим именем ветви.


1
Спасибо, отлично работает! - Я также добавляю "-C path_to_folder" в моем скрипте с этим.
— Тони

1
Это хорошее решение, потому что с опцией -q он возвращает код ошибки в состоянии «detached HEAD», но ничего не печатает в stderr.
— Hallidave

это единственное решение, которое сработало для меня на новом репо без каких-либо
— коммитов

26
git branch | grep -e "^*" | cut -d' ' -f 2

покажет только название ветки


Если ваша ветка показывает что-то вроде этого "* (HEAD отсоединен в SUM_BRANCH_01)", то попробуйте эту "git branch | grep -e" ^ * "| cut -d '' -f 5 | cut -d ')' -f 1 "
— Дилан Капп

Я только что создал этот же скрипт, чтобы получить текущее имя ветки. Я подумал, что это может помочь с разницей.
— Tggagne

25

git branch показывать только текущее название ветки

Хотя ветка git покажет вам все ветви и выделит текущую звездочку звездочкой, она может быть слишком громоздкой при работе с большим количеством веток.

Чтобы показать только ту ветку, в которой вы находитесь, используйте:

git rev-parse --abbrev-ref HEAD

Это отлично подходит для CI и других инструментов сборки!
— phouse512

лучший ответ за использование его в сценарии
— Бен Кейл

1
@DylanNicholson git branch --containsиногда перечисляет более одной ветви.
— Джо Чакко,

22

Нашел решение командной строки той же длины, что и у Оливера Рефало , используя хороший старый awk:

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

awkчитает это как "делать вещи в {}строках, соответствующих регулярному выражению". По умолчанию он принимает поля, разделенные пробелами, поэтому вы печатаете второе. Если вы можете предположить, что только строка с вашей веткой имеет *, вы можете удалить ^. Ах, баш гольф!



18

Почему бы не использовать приглашение оболочки git-aware, которое сообщит вам название текущей ветки? git statusтакже помогает.


Как git-prompt.sh из contrib/делает это (мерзавец версия 2.3.0), как это определено в __git_ps1вспомогательной функции:

  1. Во- первых, есть особый случай , если перебазироваться в процессе обнаружения. Git использует неназванную ветвь (detached HEAD) во время процесса ребазирования, чтобы сделать его атомарным, а оригинальная ветка сохраняется в другом месте.

  2. Если .git/HEADфайл является символической ссылкой (очень редкий случай из древней истории Git), он используетgit symbolic-ref HEAD 2>/dev/null

  3. Еще, он читает .git/HEADфайл. Следующие шаги зависят от его содержания:

    • Если этот файл не существует, то нет текущей ветви. Это обычно происходит, если репозиторий пуст.

    • Если он начинается с 'ref: 'префикса, то .git/HEADэто symref (символьная ссылка), и мы находимся на нормальной ветке. Удалите этот префикс, чтобы получить полное имя, и обрезайте, refs/heads/чтобы получить короткое имя текущей ветви:

      b="${head#ref: }"
      # ...
      b=${b##refs/heads/}
      
    • Если он не начинается с 'ref: ', то это отдельная HEAD (анонимная ветвь), указывающая непосредственно на какой-то коммит. Используйте git describe ...для записи текущего коммита в удобочитаемой форме.

Надеюсь, это поможет.


3
И если вы разрабатываете приглашение оболочки git -ware, какой из ответов здесь следует использовать? Черепахи все время вниз.
— tripleee


4
Что для записи, кажется, делает то, git describe --contains --all HEADчто я в настоящее время не вижу в других местах на этой странице. Как я уверен, вы знаете, что только ссылки не рекомендуются в StackOverflow.
— tripleee

2
@tripleee: я добавил объяснение, как git-prompt.sh(иначе __git_ps1) это делает ...
— Якуб Наребски

17

Менее шумная версия для статуса git поможет

git status -bsuno

Распечатывает

## branch-name

1
## развивать ... происхождение / развитие
— Kalpesh Soni

16

Извините, это еще один ответ из командной строки, но это то, что я искал, когда нашел этот вопрос, и многие из этих ответов были полезны. Мое решение - следующая функция оболочки bash:

get_branch () {
    git rev-parse --abbrev-ref HEAD | grep -v HEAD || \
    git describe --exact-match HEAD 2> /dev/null || \
    git rev-parse HEAD
}

Это всегда должно давать мне что-то как читаемое человеком, так и непосредственно используемое в качестве аргумента git checkout.

  • в местном филиале: feature/HS-0001
  • на отмеченном коммите (отсоединен): v3.29.5
  • в удаленной ветке (отдельно, без тегов): SHA1
  • на любом другом отдельном коммите: SHA1

1
Спасибо за публикацию, ни один из других ответов не заботился о том, чтобы всегда приводить что-то полезное в качестве аргумента git checkout.
— Звол

15

вы можете использовать git bash для команды рабочего каталога следующим образом

git status -b

он скажет вам, в какой ветке вы находитесь, есть много команд, которые полезны, некоторые из них

-s

--short Дать вывод в коротком формате.

-b --branch Показывать информацию о ветках и отслеживании даже в коротком формате.

--porcelain [=] Предоставить вывод в простом для анализа формате для сценариев. Это похоже на короткий вывод, но останется стабильным во всех версиях Git и независимо от конфигурации пользователя. Смотрите ниже для деталей.

Параметр version используется для указания версии формата. Это необязательно и по умолчанию используется формат оригинальной версии v1.

--long Дать вывод в длинном формате. Это по умолчанию.

-v --verbose В дополнение к именам файлов, которые были изменены, также показывают текстовые изменения, которые должны быть зафиксированы (например, вывод git diff --cached). Если -v указан дважды, то также показывают изменения в рабочем дереве, которые еще не были подготовлены (например, вывод git diff).


14
git status 

также даст название ветви вместе с изменениями.

например

>git status
On branch master // <-- branch name here
.....

13

Со временем у нас может появиться очень длинный список ветвей.

Хотя некоторые другие решения хороши, я делаю вот что (упрощенно из ответа Джейкоба):

git branch | grep \*

Сейчас же,

git status

работает, но только если есть какие-то локальные изменения


13

Я рекомендую использовать любую из этих двух команд.

git branch | grep -e "^*" | cut -d' ' -f 2

ИЛИ

git status | sed -n 1p | cut -d' ' -f 3

ИЛИ (более многословно)

git status -uno -bs| cut -d'#' -f 3 | cut -d . -f 1| sed -e 's/^[ \t]//1'| sed -n 1p


12

В Netbeans убедитесь, что аннотации управления версиями включены (Вид -> Показать метки версий). Затем вы можете увидеть название ветви рядом с именем проекта.

http://netbeans.org/bugzilla/show_bug.cgi?id=213582


Если включены аннотации управления версиями, все, что вам нужно сделать, это навести указатель мыши на папку Project (или File, или Favorite), чтобы увидеть текущую ветку.
— idclaar

12

Что насчет этого?

{ git symbolic-ref HEAD 2> /dev/null || git rev-parse --short HEAD 2> /dev/null } | sed "s#refs/heads/##"

1
Намного лучше ответить, потому что он хорошо справляется с отсоединенным блоком HEAD.
— Пэт

2
Похоже, вы должны использовать () not {} для переноса команд git
— Pat

@Pat Для этого не нужно создавать отдельную подоболочку, как (). {} хорошо, за исключением того, что вам нужно добавить; или перевод строки перед}. На самом деле, вы можете просто полностью исключить {}, если вам не нужно группировать команды.
— Aij

Разве symbolic-refчасть не должна --shortизбегать префикса фирменного названия с refs/heads/?
— RJP

11

У меня есть простой скрипт с именем git-cbr( текущая ветвь ), который выводит текущее имя ветви.

#!/bin/bash

git branch | grep -e "^*"

Я положил этот скрипт в пользовательскую папку ( ~/.bin). Папка находится в $PATH.

Так что теперь, когда я в git-репо, я просто git cbrпечатаю имя текущей ветви.

$ git cbr
* master

Это работает, потому что gitкоманда берет свой первый аргумент и пытается запустить скрипт, который называется git-arg1. Например, git branchпытается запустить скрипт с именем git-branchи т. Д.


11

Вы можете навсегда настроить вывод bash, чтобы показать имя вашей git-ветви. Это очень удобно, когда вы работаете с разными ветками, не нужно вводить $ git statusвсе время. Github repo git-aware-prompt .

Откройте свой терминал (ctrl-alt-t) и введите команды

mkdir ~/.bash
cd ~/.bash
git clone git://github.com/jimeh/git-aware-prompt.git

Отредактируйте ваш .bashrc с помощью sudo nano ~/.bashrcкоманды (для Ubuntu) и добавьте следующее:

export GITAWAREPROMPT=~/.bash/git-aware-prompt
source "${GITAWAREPROMPT}/main.sh"

Затем вставьте код

export PS1="\${debian_chroot:+(\$debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\] \[$txtcyn\]\$git_branch\[$txtred\]\$git_dirty\[$txtrst\]\$ "

в конце того же файла вы вставили код установки в ранее. Это даст вам цветной вывод:введите описание изображения здесь


10

Следующая команда оболочки сообщает вам ветку, в которой вы находитесь.

git branch | grep ^\*

Если вы не хотите вводить эту длинную команду каждый раз, когда хотите узнать ветку, и используете Bash, присвойте команде короткий псевдоним, например псевдоним cb, например, так.

alias cb='git branch | grep ^\*'

Когда вы находитесь в ветке master, и $вы получаете приглашение , вы получите * masterследующее.

$ cb
* master

Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий под своим постом. - Из обзора
— Rashwan L

1
Почему ты так думаешь?
— mrrusof

Вы должны прокомментировать и описать свой пост для ФП, так будет легче понять ваш пост.
— Rashwan L

1
Имеет смысл.
— mrrusof

1
если вы используете zsh, вам нужно обернуть регулярное выражение grep в одинарные кавычки:git branch | grep '^\*'
— aaaarrgh

9

Возвращает либо имя ветви, либо SHA1, когда на отсоединенной головке:

git rev-parse --abbrev-ref HEAD | grep -v ^HEAD$ || git rev-parse HEAD

Это короткая версия ответа @ dmaestro12 без поддержки тегов.


8
лучше:git symbolic-ref --quiet --short HEAD || git rev-parse --short HEAD
— синеватый

8

Если вы действительно хотите, чтобы последняя ветка / тег были извлечены также в отключенном состоянии HEAD.

git reflog HEAD | grep 'checkout:' | head -1 | rev | cut -d' ' -f1 | rev

Обновление Это лучше, если у вас есть и не боятся awk.

git reflog HEAD | grep 'checkout:' | head -1 | awk '{print $NF}'

rev | cut -d' ' -f1| revможет быть упрощенаawk '{print $NF}'
— Стив Buzonas

1
Хотя это и не является надежной версией, поскольку вы можете извлекать конкретную ревизию с помощью хеш-функции, так что журнал изменений показывает, checkout: moving from ba7571b7fc5b8f31b8d0625821269afaa655577e to f68be8cf7bea917a5a0562b619e50368de0068a9что это все еще полезный прием, который может помочь устранить неоднозначность в некоторых случаях.
— Алекс Дюпюи

1
Далее сократить доgit reflog | awk '$3=="checkout:" {print $NF; exit}'
— Jthill

6

Я знаю, что уже поздно, но на Linux / Mac из терминала вы можете использовать следующее.

git status | sed -n 1p

Объяснение:

git status -> получает статус рабочего дерева
sed -n 1p -> получает первую строку из тела статуса

Ответ на приведенную выше команду будет выглядеть следующим образом:

"On branch your_branch_name"

2
head -1будет обычным способом
— букзор

5

вы также можете использовать переменную GIT_BRANCH, как показано здесь: https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin

Плагин git устанавливает несколько переменных среды, которые вы можете использовать в своих скриптах:

GIT_COMMIT - SHA текущего

GIT_BRANCH - Имя используемой в данный момент ветки, например, "master" или "origin / foo"

GIT_PREVIOUS_COMMIT - SHA предыдущего встроенного коммита из той же ветви (текущий SHA при первой сборке в ветви)

GIT_URL - удаленный URL хранилища

GIT_URL_N - удаленные URL репозитория, если существует более 1 удаленных, например, GIT_URL_1, GIT_URL_2

GIT_AUTHOR_EMAIL - электронная почта коммиттера / автора

GIT_COMMITTER_EMAIL - электронная почта коммиттера / автора


5

Добавьте его в PS1Mac:

PS1='\W@\u >`[ -d .git ] && git branch | grep  ^*|cut -d" " -f2`> $ '

Перед запуском команды выше:

введите описание изображения здесь

После выполнения этой команды:

введите описание изображения здесь

Не беспокойтесь, если это не GIT-репозиторий, он не будет отображать ошибку, из-за [-d .git]которой проверяется, .gitсуществует ли папка или нет.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.