Как получить текущее название ветки в Git? - PullRequest
2142 голосов
/ 06 июня 2011

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

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

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

Ответы [ 37 ]

22 голосов
/ 20 февраля 2014

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

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

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

18 голосов
/ 23 января 2012
#!/bin/bash
function git.branch {
  br=`git branch | grep "*"`
  echo ${br/* /}
}
git.branch
17 голосов
/ 06 июня 2011

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


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

  1. Во-первых, существует особый случай, если обнаруживается rebase в процессе.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 ... для записи текущего коммита в удобочитаемой форме.

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

16 голосов
/ 08 июня 2019

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

git branch --show-current
15 голосов
/ 08 декабря 2016

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

git status -b

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

-s

- короткая Дайте вывод в коротком формате.

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

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

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

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

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

15 голосов
/ 08 апреля 2016

Извините, это еще один ответ из командной строки, но это то, что я искал, когда нашел этот вопрос, и многие из этих ответов были полезны. Мое решение - следующая функция оболочки 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
14 голосов
/ 22 марта 2018

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

git status -bsuno

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

## branch-name
13 голосов
/ 22 февраля 2018

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

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

13 голосов
/ 12 марта 2014

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

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

git branch | grep \*

Теперь

git status

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

12 голосов
/ 11 апреля 2013

Как насчет этого?

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