Как получить текущее название ветки в 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.