Узнайте, какую удаленную ветку отслеживает локальная ветка

Смотрите также:
Как я могу увидеть, какие ветви git отслеживают, какая ветка удаленной / восходящей?

Как я могу узнать, какую удаленную ветку отслеживает локальная ветка?

Нужно ли анализировать выходные данные git config, или есть команда, которая сделает это для меня?

27 ответов

Вот команда, которая дает вам все ветви отслеживания (настроенные для 'pull'), смотрите:

$ git branch -vv
  main   aaf02f0 [main/master: ahead 25] Some other commit
* master add0a03 [jdsumsion/master] Some commit

Вам нужно пройтись по SHA и любым сообщениям коммита с длинной переносом, но это быстро набрать, и я получаю, что ветви отслеживания выровнены по вертикали в 3-м столбце.

Если вам нужна информация о конфигурации "pull" и "push" для каждой ветви, см. Другой ответ на git remote show origin,


Обновить

Начиная с git версии 1.8.5, вы можете показать ветку upstream с помощью git status а также git status -sb

Два варианта:

% git rev-parse --abbrev-ref --symbolic-full-name @{u}
origin/mainline

или же

% git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)
origin/mainline

Я думаю git branch -av только говорит вам, какие ветки у вас есть и в каком коммите они находятся, оставляя вам вывод, какие удаленные ветки отслеживают локальные ветки.

git remote show origin явно говорит вам, какие ветви отслеживают, какие удаленные ветви. Вот пример выходных данных из репозитория с одним коммитом и удаленной веткой с именем abranch:

$ git branch -av
* abranch                d875bf4 initial commit
  master                 d875bf4 initial commit
  remotes/origin/HEAD    -> origin/master
  remotes/origin/abranch d875bf4 initial commit
  remotes/origin/master  d875bf4 initial commit

против

$ git remote show origin
* remote origin
  Fetch URL: /home/ageorge/tmp/d/../exrepo/
  Push  URL: /home/ageorge/tmp/d/../exrepo/
  HEAD branch (remote HEAD is ambiguous, may be one of the following):
    abranch
    master
  Remote branches:
    abranch tracked
    master  tracked
  Local branches configured for 'git pull':
    abranch merges with remote abranch
    master  merges with remote master
  Local refs configured for 'git push':
    abranch pushes to abranch (up to date)
    master  pushes to master  (up to date)

Обновление: Ну, прошло несколько лет с тех пор, как я опубликовал это! Для моей конкретной цели сравнения HEAD с апстримом я сейчас использую @{u}, который является ярлыком, который ссылается на HEAD восходящей ветви отслеживания. (См. Https://git-scm.com/docs/gitrevisions#gitrevisions-emltbranchnamegtupstreamemegemmasterupstreamememuem).

Оригинальный ответ: я тоже сталкивался с этой проблемой. Я часто использую несколько пультов в одном репозитории, и легко забыть, какой из них отслеживает ваша текущая ветка. И иногда это полезно знать, например, когда вы хотите посмотреть свои локальные коммиты через git log remotename/branchname..HEAD,

Все это хранится в переменных git config, но вам не нужно анализировать выходные данные git config. Если вы вызываете git config, за которым следует имя переменной, она просто напечатает значение этой переменной, анализ не требуется. Имея это в виду, вот несколько команд для получения информации о настройке отслеживания вашей текущей ветки:

LOCAL_BRANCH=`git name-rev --name-only HEAD`
TRACKING_BRANCH=`git config branch.$LOCAL_BRANCH.merge`
TRACKING_REMOTE=`git config branch.$LOCAL_BRANCH.remote`
REMOTE_URL=`git config remote.$TRACKING_REMOTE.url`

В моем случае, так как меня интересует только имя моего текущего пульта, я делаю это:

git config branch.`git name-rev --name-only HEAD`.remote

Местные филиалы и их пульты.

git branch -vv 

Все филиалы и трекинг пультов.

git branch -a -vv

Посмотрите, где локальные ветви явно настроены для push и pull.

git remote show {remote_name}

git branch -vv | grep 'BRANCH_NAME'

git branch -vv: В этой части будут показаны все локальные ветки вместе с их восходящей веткой.

grep 'BRANCH_NAME': Он отфильтрует текущую ветку из списка веток.

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

$ git branch -vv

Это покажет только текущую ветку, на которой вы находитесь:

$ git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)

например:

myremote/mybranch

Вы можете узнать URL пульта, который используется текущей веткой, с которой вы работаете:

$ git remote get-url $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)|cut -d/ -f1)

например:

https://github.com/someone/somerepo.git

Ты можешь использовать git checkout, то есть "проверить текущую ветку". Это неоперация с побочными эффектами для отображения информации об отслеживании, если она существует, для текущей ветви.

$ git checkout 
Your branch is up-to-date with 'origin/master'.

Еще один способ

git status -b --porcelain

Это даст вам

## BRANCH(...REMOTE)
modified and untracked files

Я не знаю, считается ли это разбором выходных данных git config, но это определит URL удаленного, который отслеживает мастер:

$ git config remote. $ (git config branch.master.remote).url

Вывод git-status porcelain (машиночитаемый) v2 выглядит так:

$ git status -b --porcelain=v2
# branch.oid d0de00da833720abb1cefe7356493d773140b460
# branch.head the-branch-name
# branch.upstream gitlab/the-branch-name
# branch.ab +2 -2

И чтобы получить ветку только вверх по течению:

$ git status -b --porcelain=v2 | grep -m 1 "^# branch.upstream " | cut -d " " -f 3-
gitlab/the-branch-name

Если ветка не имеет восходящего потока, указанная выше команда выдаст пустой вывод (или завершится ошибкой с set -o pipefail).

Другой простой способ заключается в использовании

cat .git/config в git-репо

Это будет список деталей для местных отделений

Отображать информацию только о текущей ветке без использованияgrep:

      git branch -vv --contains

Это сокращение от:

      git branch -vv --contains HEAD

и если ваш текущий идентификатор фиксации HEAD находится в других ветках, эти ветки также будут отображаться.

Другой метод (спасибо osse), если вы просто хотите узнать, существует ли он:

if git rev-parse @{u} > /dev/null 2>&1
then
  printf "has an upstream\n"
else
  printf "has no upstream\n"
fi
git branch -r -vv

перечислит все ветви, включая удаленные.

Вы можете попробовать это:

git remote show origin | grep "имя_ответа"

имя_в ветви нужно заменить на ветку ур

Перечисляет как локальные, так и удаленные филиалы:

$ git branch -ra

Выход:

  feature/feature1
  feature/feature2
  hotfix/hotfix1
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/master

Если вы хотите найти восходящий поток для любой ветви (в отличие от той, на которой вы находитесь), вот небольшое изменение в ответе @cdunn2001:

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

Это даст вам имя удаленной ветви для локальной ветви с именем YOUR_LOCAL_BRANCH_NAME,

Попробовав все решения здесь, я понял, что ни одно из них не годится во всех ситуациях:

  • работает в местных филиалах
  • работает на обособленных филиалах
  • работает под CI

Эта команда получает все имена:

git branch -a --contains HEAD --list --format='%(refname:short)'

Для моего приложения мне пришлось отфильтровать ссылки HEAD и master, отдать предпочтение удаленным ссылкам и убрать слово origin/. а затем, если это не было найдено, используйте первую ссылку без HEAD, у которой не было/ или ( в этом.

Улучшая этот ответ, я придумал эти .gitconfig псевдонимы:

branch-name = "symbolic-ref --short HEAD"
branch-remote-fetch = !"branch=$(git branch-name) && git config branch.\"$branch\".remote || echo origin #"
branch-remote-push  = !"branch=$(git branch-name) && git config branch.\"$branch\".pushRemote || git config remote.pushDefault || git branch-remote-fetch #"
branch-url-fetch = !"remote=$(git branch-remote-fetch) && git remote get-url        \"$remote\" #"  # cognizant of insteadOf
branch-url-push  = !"remote=$(git branch-remote-push ) && git remote get-url --push \"$remote\" #"  # cognizant of pushInsteadOf

Я использую EasyGit (он же "например") в качестве суперлегкой обертки над (или вдоль) Git. EasyGit имеет подкоманду "info", которая дает вам все виды супер полезной информации, включая текущую ветку удаленного отслеживания веток. Вот пример (где текущая ветвь называется "foo"):

pknotz @ s883422: (foo) ~ / workspace / bd $ например, info Всего коммитов:      175 Локальный репозиторий:.git Именованные удаленные репозитории: источник (имя -> местоположение) -> git://sahp7577/home/pknotz/bd.git Текущая ветвь: foo. Криптографическая контрольная сумма (sha1sum): bd248d1de7d759eb48e8b5ff3bfb3bb0eca4c5bf. По умолчанию выборка push / push-репозитория: origin. Настройки по умолчанию.:       28 Количество каталогов:       20 Наибольший размер файла в байтах: 32473 (pygooglechart-0.2.0/COPYING) Передает:       62

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

git remote -v

Для добавления удаленного пути,

git remote добавить источник path_name

Я использую этот псевдоним

git config --global alias.track '!sh -c "
if [ \$# -eq 2 ]
 then
   echo \"Setting tracking for branch \" \$1 \" -> \" \$2;
   git branch --set-upstream \$1 \$2;
 else
   git for-each-ref --format=\"local: %(refname:short) <--sync--> remote: %(upstream:short)\" refs/heads && echo --URLs && git remote -v;
fi  
" -'

затем

git track

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

Больше отличных псевдонимов на https://github.com/orefalo/bash-profiles

Если вы используете Gradle,

`` `

def gitHash = new ByteArrayOutputStream()    
project.exec {
                commandLine 'git', 'rev-parse', '--short', 'HEAD'
                standardOutput = gitHash
            }

    def gitBranch = new ByteArrayOutputStream()   
    project.exec {
                    def gitCmd = "git symbolic-ref --short -q HEAD || git branch -rq --contains "+getGitHash()+" | sed -e '2,\$d'  -e 's/\\(.*\\)\\/\\(.*\\)\$/\\2/' || echo 'master'"
                    commandLine "bash", "-c", "${gitCmd}"
                    standardOutput = gitBranch
                }

`` `

      git branch -vv | grep 'hardcode-branch-name'
# "git rev-parse --abbrev-ref head" will get your current branch name
# $(git rev-parse --abbrev-ref head) save it as string
#  find the tracking branch by grep filtering the current branch 
git branch -vv | grep $(git rev-parse --abbrev-ref head)

В этой теме за четвертый квартал 2023 года обсуждаются крайние случаи:

  • свежий пустой клонированный репозиторий
  • или несуществующий местный филиал

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

       git for-each-ref --format="%(upstream:short)" refs/heads/master

ничего не выводит, в то время как

       git status -b --no-ahead-behind --porcelain=v2

результаты

       # branch.oid (initial)
# branch.head master
# branch.upstream origin/master

Т.е. он выводит правильную восходящую ветвь.

Но Джефф Кинг (Пефф) отвечает:

Я думаю, что это напечатает "gone", если восходящая ветвь пропала.
Но в этом случае отсутствует фактическая локальная ветвь. Иfor-each-refвообще не будет показывать запись для ссылки, которая не существует.
"refs/heads/master» в вашей командной строке не ссылка, а шаблон, и этот шаблон ничему не соответствует. Итак, он работает так, как задумано.

Я думаю, что более прямым инструментом было бы:

       git rev-parse --symbolic-full-name master@{upstream}

Это убеждаетbranch_get_upstream()чтобы вернуть желаемое значение, но, к сожалению, оно где-то теряется в процессе разрешения, и мы выдаем ошибку. Возможно, это ошибка (с--symbolicили--symbolic-full-name, я думаю, было бы нормально разрешать имена, даже если они ни на что не указывают, но возможно, что это будет иметь и другие неожиданные побочные эффекты).

      $ git remote --verbose 

(или же)

      $ git remote --v 

(или же)

      $ git remote -vv

(или) Узнать подробнее об удаленной ветке и Головной ветке

      $ git remote show origin

Чтобы узнать о конкретном удаленном филиале и головном филиале

      $ git remote show origin | grep master
Username for 'https://github.com': Pra.....@9
  HEAD branch: master
    master tracked
    master merges with remote master
    master pushes to master (up to date)
Другие вопросы по тегам