Вопрос: Как узнать, какая локальная ветка отслеживает удалённую ветку в Git?


Я хотел бы знать, есть ли способ узнать, какая локальная ветка отслеживает удаленную ветку в Git.

Я использую один удаленный сервер, который называется «origin».


230
2017-08-27 01:04


Источник


Исправьте меня, если я ошибаюсь, но разве это не удаленная ветка, которая по умолчанию называется именем по умолчанию, а не сервером? - Chris Halcrow


Ответы:


Используя пример моей копии Puppet, выписанный из репозитория Git вверх по Github.com ...

$ git remote show origin
* remote origin
  Fetch URL: git://github.com/reductivelabs/puppet.git
  Push  URL: git://github.com/reductivelabs/puppet.git
  HEAD branch: master
  Remote branches:
    0.24.x                 tracked
    0.25.x                 tracked
    2.6.x                  tracked
    master                 tracked
    next                   tracked
    primordial-ooze        tracked
    reins-on-a-horse       tracked
    testing                tracked
    testing-17-march       tracked
    testing-18-march       tracked
    testing-2-april        tracked
    testing-2-april-midday tracked
    testing-20-march       tracked
    testing-21-march       tracked
    testing-24-march       tracked
    testing-26-march       tracked
    testing-29-march       tracked
    testing-31-march       tracked
    testing-5-april        tracked
    testing-9-april        tracked
    testing4268            tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

Тогда, если я должен был выполнить следующее:

$ git checkout -b local_2.6 -t origin/2.6.x 
Branch local_2.6 set up to track remote branch 2.6.x from origin.
Switched to a new branch 'local_2.6'

И, наконец, повторно запустите git remote show origin команду снова, я увижу следующее внизу:

  Local branches configured for 'git pull':
    local_2.6 merges with remote 2.6.x
    master    merges with remote master

197
2017-08-27 03:03



Значит, это означает, что вы можете отслеживать все отдаленные ветви в марионетке, хотя у вас есть несколько местных филиалов. Какое количество «отслеживаемых» знаков означает, что вы видите результат команды? «отслеживается», с какой локальной ветвью? - PJ.
Удаленные ветви отслеживаются в том случае, если вы выполняете git fetch или git pull обновления в удаленных филиалах будут отслеживаться в вашем клонированном репозитории. Локальные ветви - это только то, что локальные ветви удаленных филиалов и, таким образом, обновления удаленных филиалов будут отслеживаться и объединяться, когда указывается соответствующая команда для этого. Я явно включаю параметр «-t», когда локальная ветвь должна отслеживать ветку, из которой она возникла. Помните, что локальная ветка также может отслеживать другую локальную ветвь, поэтому не обязательно должна быть удаленная ветвь. - Jeremy Bouse
@PJ: термин «дорожка» имеет два разных значения в Git. «Отслеженные» строки в git remote show remote-name Ссылаться на "Отслеживание ветвей" (моментальные снимки ветвей из удаленных репозиториев). Строки «сливаются с» относятся к локальным ветвям, которые имеют «Восходящая ветка» конфигурации (с --track/-t вариант гит-ветвь или git checkout и поэтому часто путают с «ветвями отслеживания»). - Chris Johnsen
"ветвь удаленного отслеживания«представляет собой обновленную запись глоссария для« филиалов отслеживания », упомянутых выше. Документ был обновлен в 8b3f3f84, - ento


Для всех филиалов:

git branch -avv

Только для местных филиалов:

git branch -lvv

Только для удаленных филиалов:

git branch -rvv

показывает все ветви, а также имя ветви вверх по течению.


122
2018-02-14 16:02



Это, безусловно, самый простой и полный ответ!
В git версии 1.7.7.5 это показывает мне локальную ветку и sha-1, на которую указывает, но она не отображает отслеживаемую удаленную ветку ... - mpontillo
Работает для меня на git версии 1.7.4.1 Второй «v» требуется для отображения ветви удаленного отслеживания. - Peter Johnson
сократить выпуск git branch -lvv показать, что только местные филиалы с восходящим потоком могут быть полезны - A B
^git branch -vv работает на меня... - notacouch


Джереми Боуз иллюстрирует как git remote show отображает информацию о отслеживании, Этого должно быть достаточно, если вам нужна только информация для потребления человеком.

Если вы планируете использовать информацию в автоматическом контексте (например, сценарий), вы должны использовать нижний уровень («сантехника») git for-each-ref вместо.

% git remote show origin
* remote origin
⋮
  Local branches configured for 'git pull':
    master merges with remote master
    pu     merges with remote pu
⋮
% git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads
master <- origin/master
pu <- origin/pu

git for-each-ref узнал %(upstream) токен в Git 1.6.3, С более ранними версиями Git вам придется извлекать информацию отслеживания с помощью git config branch.<name>.remote а также git config branch.<name>.merge (возможно, используя git for-each-ref для создания команд для каждого имени локальной ветви).


52
2017-08-27 03:18



Ваши ответы выводятся гораздо более краткими и легче следовать, поэтому вы получаете голосование :) - CubanX
Чтобы сделать его менее кратким, но обеспечим хороший способ визуально проверить, что удаленные имена совпадают с именами локальных ветвей, общий git gotcha: in bash git for-each-ref --format=$'\n'' '' '' '' '' '' ''/%(refname:short);%(upstream:short)' refs/heads | tr ';' $'\n' - hobs


Для конкретной ветки вы можете использовать git rev-parse с @{u} или @{upstream} суффикс имени филиала, например:

$  git rev-parse --symbolic-full-name master@{u}
refs/remotes/github-mhl/master

... или для сокращенной формы, добавьте --abbrev-ref

$ git rev-parse --symbolic-full-name --abbrev-ref master@{u}
github-mhl/master

Обычно вы можете использовать branch@{upstream} синтаксис везде, где ожидается фиксация.


18
2018-05-01 09:18



+1 Ваш ответ дал мне именно то, что мне нужно: git rev-parse --symbolic-full-name HEAD против git rev-parse --symbolic-full-name HEAD@{u}, благодаря! - Tino


Я использую следующий сценарий оболочки (named git-tracks), чтобы показать удаленную ветвь, отслеживаемую текущей ветвью:

#!/bin/sh -e
branch=$(git symbolic-ref HEAD)
branch=${branch##refs/heads/}
remote=$(git config "branch.${branch}.remote")
remoteBranch=$(git config "branch.${branch}.merge")
remoteBranch=${remoteBranch##refs/heads/}

echo "${remote:?}/${remoteBranch:?}"

Это может также использовать упомянутые git for-each-ref, но я нашел, что прямой доступ несколько проще, чем фильтрация вывода для текущей ветви.


10
2018-01-21 14:26



Вы можете использовать «set -e» в верхней части скрипта. Это позволит вам удалить все экземпляры «|| exit $?». сохраняя при этом такое же неудачное поведение. - John Whitley
@JohnWhitley: Спасибо, я отредактировал свой ответ. Я знаю о set -e, но обычно придерживаются явной проверки. Но в этом случае это действительно лучше. - Ingo Karkat
Не работает для меня git version 1.9.4, Echos ничего :( - Ain


.git/config файл также предоставит информацию о филиале отслеживания как

[remote "Hub"]
    url = ssh://xxxx/tmp/Hub
    fetch = +refs/heads/*:refs/remotes/Hub/*
[branch "develop"]
    remote = Hub
    merge = refs/heads/develop
[branch "Dev1"]
    remote = Test
    merge = refs/heads/Dev1
[remote "Test"]
    url = ssh://xxxx/tmp/gittesting/Dev1GIT
    fetch = +refs/heads/*:refs/remotes/Test/*

8
2017-10-11 12:59





git branch -vv

показывает то, что вы просите. Он показывает локальные ветви вместе с соответствующей удаленной ветвью, которую они отслеживают.


5
2018-05-07 07:50