Как я могу увидеть, какие ветки 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
текущей ветки.