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


234

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

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


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

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


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:]]//"'

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
Они показывают ветки, но я не понимаю, какая из них отслеживает какую.
— Пи Джей.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.