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

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

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

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

Ответ 1

git branch

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

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

git branch | grep \* | cut -d ' ' -f2

Ответ 3

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

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

$ git symbolic-ref --short HEAD

В Git v1.7 + вы также можете:

$ git rev-parse --abbrev-ref HEAD

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

Примечание:

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

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

- Дариен 26. Март 2014

Ответ 4

Для моей собственной справки (но это может быть полезно для других) я сделал обзор большинства (основных командных строк) методов, упомянутых в этом потоке, каждый из которых применяется к нескольким случаям использования: 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
    • tag: # 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)

Ответ 5

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

git name-rev --name-only HEAD

Ответ 6

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

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

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

И пока я там, один лайнер для получения удаленной ветки отслеживания (если есть)

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

Ответ 7

Вы можете просто ввести командную строку (консоль) в Linux в каталоге репозитория:

$ git status

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

...
On branch master
...

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

Ответ 8

git symbolic-ref -q --short HEAD

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

Ответ 9

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

будет отображаться только название ветки

Ответ 10

Найденное решение командной строки той же длины, что и Oliver Refalo, используя хороший ol awk:

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

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

Ответ 11

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

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

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

git rev-parse --abbrev-ref HEAD

Ответ 12

#!/bin/bash
function git.branch {
  br=`git branch | grep "*"`
  echo ${br/* /}
}
git.branch

Ответ 13

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


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

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

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

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

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

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

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

Я надеюсь, что это поможет.

Ответ 14

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

git status -b

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

-s

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

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

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

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

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

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

Ответ 15

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

Ответ 16

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

В то время как некоторые из других решений велики, вот что я делаю (упрощенное от ответа Иакова):

git branch | grep \*

Теперь,

git status

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

Ответ 17

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

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

Ответ 18

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

git status -bsuno

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

## branch-name

Ответ 19

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

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

Ответ 20

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

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

Ответ 21

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

#!/bin/bash

git branch | grep -e "^*"

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

Итак, теперь, когда я нахожусь в репозитории git, просто просто наберите git cbr, чтобы распечатать текущее имя ветки.

$ git cbr
* master

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

Ответ 22

Вы можете навсегда настроить свой bash вывод, чтобы показать ваше имя git -branch. Это очень удобно, когда вы работаете с разными ветвями, не нужно набирать $ 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\]\[email protected]\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\] \[$txtcyn\]\$git_branch\[$txtred\]\$git_dirty\[$txtrst\]\$ "

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

Ответ 23

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

git branch | grep ^\*

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

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

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

$ cb
* master

Ответ 24

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

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

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

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

Ответ 25

git status 

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

например

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

Ответ 26

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

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

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

Ответ 27

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

git status | sed -n 1p

Пояснение:

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

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

"On branch your_branch_name"

Ответ 28

вы также можете использовать переменную 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 - электронная почта коммиттера/автора

Ответ 29

Добавьте его в PS1 используя Mac:

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

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

enter image description here

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

enter image description here

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

Ответ 30

git branch | grep "*" | sed "s/* //" | awk '{printf $0}' | pbcopy

Прямая копия результата в картон. Благодаря @olivier-refalo для начала...