it-roy-ru.com

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

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

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

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

1927
mike628
git branch

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

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

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

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

git rev-parse --abbrev-ref HEAD

Ссылка:

4006
Jistanidiot

У вас также есть 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

444
Wernight

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

  • местное отделение (мастер)
  • ветка удаленного отслеживания, синхронизированная с локальной веткой (Origin/master при том же коммите, что и master)
  • ветка удаленного отслеживания, не синхронизированная с локальной веткой (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)
    • субмодуль: `(ГОЛОВА отсоединена в 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)

198
Stefaan

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

git name-rev --name-only HEAD
126
Filip Spiridonov

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

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

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

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

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

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

$ git status

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

...
On branch master
...

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

59
Tadeck
git symbolic-ref -q --short HEAD

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

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

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

24
ungalcrys

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

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

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

21
Silas Barta

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

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

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

git rev-parse --abbrev-ref HEAD
20
Lawrence Paje
#!/bin/bash
function git.branch {
  br=`git branch | grep "*"`
  echo ${br/* /}
}
git.branch
17
Dziamid

Почему бы не использовать git-aware Shell Prompt, которая сообщит вам название текущей ветки? 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 ... для записи текущего коммита в удобочитаемой форме.

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

15
Jakub Narębski

вы можете использовать git bash в рабочем каталоге.

git status -b

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

-s

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

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

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

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

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

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

14
Prateek Gangwal

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

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

OR

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
jackotonye

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

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

git branch | grep \*

Сейчас,

git status

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

12
karthikr

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

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

git status -bsuno

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

## branch-name
11
dgolovin

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

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

11
Saroj

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

#!/bin/bash

git branch | grep -e "^*"

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

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

$ git cbr
* master

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

10
Diego Pino

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

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

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

git branch | grep ^\*

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

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

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

$ cb
* master
9
mrrusof

Вы можете навсегда настроить вывод 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\]\[email protected]\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\] \[$txtcyn\]\$git_branch\[$txtred\]\$git_dirty\[$txtrst\]\$ "

в конце того же файла вы вставили код установки в ранее. Это даст вам цветной вывод:  enter image description here

8
Kirill Zhuravlov

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

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

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

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

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

например.

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

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

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

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

6
user

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

git status | sed -n 1p

Объяснение:

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

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

"On branch your_branch_name"
5
skippy

Добавьте его в 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 или нет. 

4
Abdennour TOUMI

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

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

GIT_COMMIT - SHA текущего

GIT_BRANCH - название используемой в данный момент ветви, например, "мастер" или "Происхождение/Фу"

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 - электронная почта коммиттера/автора

4
user3405314

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

git branch --show-current
4
Max
git branch | grep "*" | sed "s/* //" | awk '{printf $0}' | pbcopy

Чтобы напрямую скопировать результат в монтажный картон. Спасибо @ olivier-refalo за начало ...

2
SushiGrass Jacob

Используя более ранние идеи; при условии, что sha1 составляет 40 символов; и погоня за ссылками (да, следует удалить строки отладочной печати :-):

git reflog | awk '
$3 == "checkout:" && (sha == "" || sha == $1 ) {
  from=$(NF - 2)
  to=$NF
  print from, to, length(from) > "/dev/stderr"
  if (length(from) != 40) { print from ; exit; }
  sha=substr(from, 1, 7)
  print sha > "/dev/stderr"
}
'

дает необработанный вывод:

$ git status
HEAD detached at 147049c
[...]
$ ./gime-branch.sh
a47be8d2167641088b66bf8f5c2bf7d3da0c642c HEAD^ 40
a47be8d
master HEAD^ 6
master
2
cagney

Просто добавьте следующие строки в ваш ~/.bash_profile:

branch_show() {
     git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1="\[email protected]\h \[\033[32m\]\w\[\033[33m\]\$(branch_show)\[\033[00m\] $ "

Таким образом, вы можете иметь текущее имя филиала в Терминале

Предоставлено Coderwall.com

1
SHi ON

Вы можете сделать это с помощью одной команды grep, используя режим Perl и \K для сброса буфера соответствия, так что вы получите только имя ветви.

$ git branch | grep -oP "^\*\s+\K\S+$"
master
0
Joseph Lust

Используйте git branch --contains HEAD | tail -1 | xargs, это также работает для состояния "отсоединенного HEAD".

0
glisu

Получить только локальное название филиала:

git status -b -u no | awk 'NR==1{print $3;}'

Получить только имя удаленной ветви:

git status -b -u no | awk 'NR==2{print $6;}'

и git status -b -u no | awk 'NR==2{print $6;}' | tr -d "[.']" для удаления специальных символов из вывода

0
v.babak

Я знаю, что на этот вопрос уже был дан ответ, но в самой последней версии Git команда git branch открывает список ваших веток в каком-либо приглашении, из которого вам нужно выйти. Что меня раздражает без конца!

Вот мое исправление: Откройте свой профиль bash и введите его:

#!/bin/bash
git() {
  if [[ [email protected] == "branch" ]] then
    command git branch -a | grep -v 'remotes'
  else
    command git "[email protected]"
  fi
}

Теперь откройте Terminal и протестируйте его, введя следующие команды в git repo:

source ~/.zshrc
git branch 

И вуаля! Список ваших местных отделений распечатывается в вашем терминале.

Код, который вы пишете в файл bashrc, перезаписывает функцию по умолчанию для git branch и заменяет ее намного более длинной командой, которая перечисляет все локальные ветви с помощью аргумента -a. Затем мы grep выводим лишний ненужный бизнес и распечатываем его. Если вы исключите команду grep, вы все равно получите надоедливую подсказку. Если вы не знакомы с написанием команд bash, ознакомьтесь с этим объяснением: О .bash_profile, .bashrc, и где должен быть записан псевдоним?

0
okTalk