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

234

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

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

PJ.
источник
Поправьте меня, если я ошибаюсь, но это не удаленная ветка, которая по умолчанию называется origin, а не сервер ??
Крис Холкроу

Ответы:

196

Используя пример моей копии 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
Джереми Бауз
источник
1
Значит ли это, что вы можете отслеживать все удаленные ветви в Puppet, хотя у вас есть несколько локальных ветвей. Какие многочисленные «отслеживаемые» знаки означают, что вы видите в результате выполнения команды? "отслеживается" по какой местной ветке?
Пи Джей.
Удаленные ветки отслеживаются тем, что если вы выполняете git fetchили git pullобновления к удаленным веткам будут отслеживаться в вашем клонированном хранилище. Локальные ветви - это только то, что локальные ветви удаленных ветвей и, следовательно, обновления для удаленных ветвей будут отслеживаться и объединяться, когда будет дана соответствующая команда для этого. Я явно включаю опцию '-t' при создании локальной ветви, чтобы убедиться, что она отслеживает ветку, из которой она произошла. Помните, что локальная ветвь может также отслеживать другую локальную ветвь, поэтому она не должна быть удаленной.
Джереми Бауз
5
@PJ: Термин «трек» имеет два разных значения в Git. «Отслеживаемые» строки git remote show remote-nameотносятся к «отслеживанию веток» (снимки веток из удаленных репозиториев). Строки «слияния с» относятся к локальным ветвям, которые имеют конфигурацию «восходящая ветвь» ( создается с помощью опции --track/ git branch или git checkout и поэтому часто путается с «отслеживающими ветвями»). -t
Крис Джонсен
« Удаленное отслеживание ветви » - это актуальная запись глоссария для «отслеживания филиалов», упомянутых выше. Документ обновлен в 8b3f3f84 .
енто
124

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

git branch -avv

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

git branch -lvv

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

git branch -rvv

показывает все ветки, а также название восходящей ветки.

sunew
источник
2
Это, безусловно, самый простой и полный ответ!
6
В git версии 1.7.7.5 это показывает мне локальную ветку и sha-1, на которую он указывает, но не показывает отслеживаемую удаленную ветку ...
mpontillo
У меня работает на git версии 1.7.4.1. Второй 'v' требуется, чтобы показать ветку удаленного отслеживания.
Питер Джонсон
4
чтобы уменьшить вывод, git branch -lvvмогут быть полезны только локальные ветви с апстримом
AB
5
^ git branch -vvработает для меня ...
notacouch
52

Джереми Бауз показывает, как 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для построения команд для каждого локального имени ветки).

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

Для конкретной ветви вы можете использовать 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}синтаксис везде, где ожидается фиксация.

Марк Лонгэйр
источник
1
+1 Твой ответ дал мне именно то, что мне было нужно: git rev-parse --symbolic-full-name HEADпротив git rev-parse --symbolic-full-name HEAD@{u}, спасибо!
Тино
10

Я использую следующий сценарий оболочки (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, но я обнаружил, что прямой доступ несколько проще, чем фильтрация вывода для текущей ветви.

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

.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/*
Картик
источник
5
git branch -vv

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

Ярл
источник
2

Добавьте эти руны в [alias]раздел вашего файла .gitconfig:

show-tracking = !sh -c 'git ls-remote . |grep `git log -1 --grep="git-svn-id" --format=%H`|perl -pe "s/[[:alnum:]]+[[:space:]]//"'
Daver
источник
0

Мне нужно было найти соответствующую удаленную ветвь (если таковая имеется) для каждой локальной ветки в цикле, который действовал в списке локальных ветвей. Я закончил тем, что использовал следующее:

git for-each-ref --format='%(refname:short):%(upstream:short)' refs/heads | grep "^LocalBranchName:.*/" | sed "s/^LocalBranchName://"

Это ничего не выдаст (пустая строка) для локальных веток, у которых нет соответствующей удаленной ветки («someremote / somebranch»).

Виль
источник
-1

Попробуйте git branch с опциями :

 -r
List or delete (if used with -d) the remote-tracking branches. 

-a
List both remote-tracking branches and local branches. 

В противном случае, проверьте ваш .git/config.

Андрей
источник
3
Они показывают ветки, но я не понимаю, какая из них отслеживает какую.
Пи Джей.