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

Я знаю, что могу сделать git branch --all, и это показывает мне как локальные, так и удаленные ветки, но это не так полезно, показывая мне отношения между ними.

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

Ответы

Ответ 1

Очень фарфоровая команда, не очень хорошая, если вы хотите это для скриптов:

git branch -vv   # doubly verbose!

Обратите внимание, что с git 1.8.3 эта ветвь вверх по течению отображается в синем (см. "Что это за отслеживание отрасли (если есть) в git?" )


Если вы хотите получить чистый результат, см. ответ arcresu - он использует команду фарфора, которая, как я полагаю, не существовала в то время, когда я изначально написал этот ответ, немного более кратким и работает с ветвями, настроенными для rebase, а не просто слиянием.

Ответ 2

git remote show origin

Замените "origin" на любое имя вашего пульта.

Ответ 3

Если вы посмотрите на справочную страницу git-rev-parse, вы увидите следующий синтаксис:

<branchname>@{upstream}, например [email protected]{upstream}, @{u}

Суффикс @{upstream} к имени-ветки (сокращенная форма <branchname>@{u}) относится к ветки, над которой устанавливается ветка, указанная в Branchname. Отсутствующее фирменное имя по умолчанию соответствует текущему.

Следовательно, чтобы найти восходящую ветвь master ветки, вы должны сделать:

git rev-parse --abbrev-ref [email protected]{upstream}
# => origin/master

Чтобы распечатать информацию для каждой ветки, вы можете сделать что-то вроде:

while read branch; do
  upstream=$(git rev-parse --abbrev-ref [email protected]{upstream} 2>/dev/null)
  if [[ $? == 0 ]]; then
    echo $branch tracks $upstream
  else
    echo $branch has no upstream configured
  fi
done < <(git for-each-ref --format='%(refname:short)' refs/heads/*)

# Output:
# master tracks origin/master
# ...

Это чище, чем разбор ссылок и настроек вручную.

Ответ 4

Альтернативой куби-ответу является просмотр файла .git/config, который показывает конфигурацию локального репозитория:

cat .git/config

Ответ 5

Для текущей ветки, вот два хороших варианта:

% 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

Этот ответ также здесь, к немного другому вопросу, который был (ошибочно) отмечен как дубликат.

Ответ 6

git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads

отобразит строку для каждой локальной ветки. Отслеживающая ветка будет выглядеть так:

master <- origin/master

Не отслеживающий будет выглядеть следующим образом:

test <- 

Ответ 7

Для текущей ветки вы также можете сказать git checkout (без какой-либо ветки). Это no-op с побочными эффектами для отображения информации отслеживания, если она существует, для текущей ветки.

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

Ответ 8

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

git config --global alias.track '!f() { ([ $# -eq 2 ] && ( echo "Setting tracking for branch " $1 " -> " $2;git branch --set-upstream $1 $2; ) || ( git for-each-ref --format="local: %(refname:short) <--sync--> remote: %(upstream:short)" refs/heads && echo --Remotes && git remote -v)); }; f'

затем

git track

Ответ 9

На основе ответ Оливье Рефало

if [ $# -eq 2 ] 
then
    echo "Setting tracking for branch " $1 " -> " $2
    git branch --set-upstream $1 $2
else
    echo "-- Local --" 
    git for-each-ref --shell --format="[ %(upstream:short) != '' ] && echo -e '\t%(refname:short) <--> %(upstream:short)'" refs/heads | sh
    echo "-- Remote --" 
    REMOTES=$(git remote -v) 
    if [ "$REMOTES" != '' ]
    then
        echo $REMOTES
    fi  
fi

Он показывает только локальный с настроенной дорожкой.

Запишите его на script с именем git -track на вашем пути, и вы получите команду git track

Более подробная версия https://github.com/albfan/git-showupstream

Ответ 10

git config --get-regexp "branch\.$current_branch\.remote"

даст вам имя удаляемого пульта

git config --get-regexp "branch\.$current_branch\.merge"

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

Вам нужно будет заменить $current_branch именем вашей текущей ветки. Вы можете получить это динамически с помощью git rev-parse --abbrev-ref HEAD

Следующий mini- script объединяет эти вещи. Вставьте его в файл с именем git-tracking, сделайте его исполняемым и убедитесь, что он по вашему пути.

то вы можете сказать

$ git  tracking
<current_branch_name>-><remote_repo_name>/<remote_branch_name>

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

$git tracking 
xxx_xls_xslx_thing -> origin/totally_bogus

как вы можете видеть в коде, ключом к этому является извлечение данных из конфигурации git. Я просто использую sed, чтобы очистить посторонние данные.

#!/bin/sh

current_branch=$(git rev-parse --abbrev-ref HEAD)
remote=$(git config --get-regexp "branch\.$current_branch\.remote" | sed -e "s/^.* //")
remote_branch=$(git config --get-regexp "branch\.$current_branch\.merge" | \
  sed -e "s/^.* //" -e "s/refs\/.*\///")

echo "$current_branch -> $remote/$remote_branch"

Ответ 11

Вот аккуратный и простой. Можно проверить git remote -v, который показывает вам все источники и восходящие git remote -v текущей ветки.