Узнайте, какую удаленную ветку отслеживает локальная ветка
Смотрите также:
Как я могу увидеть, какие ветви git отслеживают, какая ветка удаленной / восходящей?
Как я могу узнать, какую удаленную ветку отслеживает локальная ветка?
Нужно ли анализировать выходные данные git config, или есть команда, которая сделает это для меня?
27 ответов
Вот команда, которая дает вам все ветви отслеживания (настроенные для 'pull'), смотрите:
$ git branch -vv
main aaf02f0 [main/master: ahead 25] Some other commit
* master add0a03 [jdsumsion/master] Some commit
Вам нужно пройтись по SHA и любым сообщениям коммита с длинной переносом, но это быстро набрать, и я получаю, что ветви отслеживания выровнены по вертикали в 3-м столбце.
Если вам нужна информация о конфигурации "pull" и "push" для каждой ветви, см. Другой ответ на git remote show origin
,
Обновить
Начиная с git версии 1.8.5, вы можете показать ветку upstream с помощью git status
а также git status -sb
Два варианта:
% 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
Я думаю git branch -av
только говорит вам, какие ветки у вас есть и в каком коммите они находятся, оставляя вам вывод, какие удаленные ветки отслеживают локальные ветки.
git remote show origin
явно говорит вам, какие ветви отслеживают, какие удаленные ветви. Вот пример выходных данных из репозитория с одним коммитом и удаленной веткой с именем abranch
:
$ git branch -av
* abranch d875bf4 initial commit
master d875bf4 initial commit
remotes/origin/HEAD -> origin/master
remotes/origin/abranch d875bf4 initial commit
remotes/origin/master d875bf4 initial commit
против
$ git remote show origin
* remote origin
Fetch URL: /home/ageorge/tmp/d/../exrepo/
Push URL: /home/ageorge/tmp/d/../exrepo/
HEAD branch (remote HEAD is ambiguous, may be one of the following):
abranch
master
Remote branches:
abranch tracked
master tracked
Local branches configured for 'git pull':
abranch merges with remote abranch
master merges with remote master
Local refs configured for 'git push':
abranch pushes to abranch (up to date)
master pushes to master (up to date)
Обновление: Ну, прошло несколько лет с тех пор, как я опубликовал это! Для моей конкретной цели сравнения HEAD с апстримом я сейчас использую @{u}
, который является ярлыком, который ссылается на HEAD восходящей ветви отслеживания. (См. Https://git-scm.com/docs/gitrevisions#gitrevisions-emltbranchnamegtupstreamemegemmasterupstreamememuem).
Оригинальный ответ: я тоже сталкивался с этой проблемой. Я часто использую несколько пультов в одном репозитории, и легко забыть, какой из них отслеживает ваша текущая ветка. И иногда это полезно знать, например, когда вы хотите посмотреть свои локальные коммиты через git log remotename/branchname..HEAD
,
Все это хранится в переменных git config, но вам не нужно анализировать выходные данные git config. Если вы вызываете git config, за которым следует имя переменной, она просто напечатает значение этой переменной, анализ не требуется. Имея это в виду, вот несколько команд для получения информации о настройке отслеживания вашей текущей ветки:
LOCAL_BRANCH=`git name-rev --name-only HEAD`
TRACKING_BRANCH=`git config branch.$LOCAL_BRANCH.merge`
TRACKING_REMOTE=`git config branch.$LOCAL_BRANCH.remote`
REMOTE_URL=`git config remote.$TRACKING_REMOTE.url`
В моем случае, так как меня интересует только имя моего текущего пульта, я делаю это:
git config branch.`git name-rev --name-only HEAD`.remote
Местные филиалы и их пульты.
git branch -vv
Все филиалы и трекинг пультов.
git branch -a -vv
Посмотрите, где локальные ветви явно настроены для push и pull.
git remote show {remote_name}
git branch -vv | grep 'BRANCH_NAME'
git branch -vv
: В этой части будут показаны все локальные ветки вместе с их восходящей веткой.
grep 'BRANCH_NAME'
: Он отфильтрует текущую ветку из списка веток.
Это покажет вам ветку, на которой вы находитесь:
$ git branch -vv
Это покажет только текущую ветку, на которой вы находитесь:
$ git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)
например:
myremote/mybranch
Вы можете узнать URL пульта, который используется текущей веткой, с которой вы работаете:
$ git remote get-url $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)|cut -d/ -f1)
например:
https://github.com/someone/somerepo.git
Ты можешь использовать git checkout
, то есть "проверить текущую ветку". Это неоперация с побочными эффектами для отображения информации об отслеживании, если она существует, для текущей ветви.
$ git checkout
Your branch is up-to-date with 'origin/master'.
Еще один способ
git status -b --porcelain
Это даст вам
## BRANCH(...REMOTE)
modified and untracked files
Я не знаю, считается ли это разбором выходных данных git config, но это определит URL удаленного, который отслеживает мастер:
$ git config remote. $ (git config branch.master.remote).url
Вывод git-status porcelain (машиночитаемый) v2 выглядит так:
$ git status -b --porcelain=v2
# branch.oid d0de00da833720abb1cefe7356493d773140b460
# branch.head the-branch-name
# branch.upstream gitlab/the-branch-name
# branch.ab +2 -2
И чтобы получить ветку только вверх по течению:
$ git status -b --porcelain=v2 | grep -m 1 "^# branch.upstream " | cut -d " " -f 3-
gitlab/the-branch-name
Если ветка не имеет восходящего потока, указанная выше команда выдаст пустой вывод (или завершится ошибкой с set -o pipefail
).
Другой простой способ заключается в использовании
cat .git/config
в git-репо
Это будет список деталей для местных отделений
Отображать информацию только о текущей ветке без использованияgrep
:
git branch -vv --contains
Это сокращение от:
git branch -vv --contains HEAD
и если ваш текущий идентификатор фиксации HEAD находится в других ветках, эти ветки также будут отображаться.
Другой метод (спасибо osse), если вы просто хотите узнать, существует ли он:
if git rev-parse @{u} > /dev/null 2>&1
then
printf "has an upstream\n"
else
printf "has no upstream\n"
fi
Вы можете попробовать это:
git remote show origin | grep "имя_ответа"
имя_в ветви нужно заменить на ветку ур
Перечисляет как локальные, так и удаленные филиалы:
$ git branch -ra
Выход:
feature/feature1
feature/feature2
hotfix/hotfix1
* master
remotes/origin/HEAD -> origin/master
remotes/origin/develop
remotes/origin/master
Если вы хотите найти восходящий поток для любой ветви (в отличие от той, на которой вы находитесь), вот небольшое изменение в ответе @cdunn2001:
git rev-parse --abbrev-ref --symbolic-full-name YOUR_LOCAL_BRANCH_NAME@{upstream}
Это даст вам имя удаленной ветви для локальной ветви с именем YOUR_LOCAL_BRANCH_NAME
,
Попробовав все решения здесь, я понял, что ни одно из них не годится во всех ситуациях:
- работает в местных филиалах
- работает на обособленных филиалах
- работает под CI
Эта команда получает все имена:
git branch -a --contains HEAD --list --format='%(refname:short)'
Для моего приложения мне пришлось отфильтровать ссылки HEAD и master, отдать предпочтение удаленным ссылкам и убрать слово origin/. а затем, если это не было найдено, используйте первую ссылку без HEAD, у которой не было/
или (
в этом.
Улучшая этот ответ, я придумал эти .gitconfig
псевдонимы:
branch-name = "symbolic-ref --short HEAD"
branch-remote-fetch = !"branch=$(git branch-name) && git config branch.\"$branch\".remote || echo origin #"
branch-remote-push = !"branch=$(git branch-name) && git config branch.\"$branch\".pushRemote || git config remote.pushDefault || git branch-remote-fetch #"
branch-url-fetch = !"remote=$(git branch-remote-fetch) && git remote get-url \"$remote\" #" # cognizant of insteadOf
branch-url-push = !"remote=$(git branch-remote-push ) && git remote get-url --push \"$remote\" #" # cognizant of pushInsteadOf
Я использую EasyGit (он же "например") в качестве суперлегкой обертки над (или вдоль) Git. EasyGit имеет подкоманду "info", которая дает вам все виды супер полезной информации, включая текущую ветку удаленного отслеживания веток. Вот пример (где текущая ветвь называется "foo"):
pknotz @ s883422: (foo) ~ / workspace / bd $ например, info Всего коммитов: 175 Локальный репозиторий:.git Именованные удаленные репозитории: источник (имя -> местоположение) -> git://sahp7577/home/pknotz/bd.git Текущая ветвь: foo. Криптографическая контрольная сумма (sha1sum): bd248d1de7d759eb48e8b5ff3bfb3bb0eca4c5bf. По умолчанию выборка push / push-репозитория: origin. Настройки по умолчанию.: 28 Количество каталогов: 20 Наибольший размер файла в байтах: 32473 (pygooglechart-0.2.0/COPYING) Передает: 62
Следующая команда будет использовать удаленный источник, на который ссылается текущий форк
git remote -v
Для добавления удаленного пути,
git remote добавить источник path_name
Я использую этот псевдоним
git config --global alias.track '!sh -c "
if [ \$# -eq 2 ]
then
echo \"Setting tracking for branch \" \$1 \" -> \" \$2;
git branch --set-upstream \$1 \$2;
else
git for-each-ref --format=\"local: %(refname:short) <--sync--> remote: %(upstream:short)\" refs/heads && echo --URLs && git remote -v;
fi
" -'
затем
git track
обратите внимание, что скрипт также может быть использован для настройки отслеживания.
Больше отличных псевдонимов на https://github.com/orefalo/bash-profiles
Если вы используете Gradle,
`` `
def gitHash = new ByteArrayOutputStream()
project.exec {
commandLine 'git', 'rev-parse', '--short', 'HEAD'
standardOutput = gitHash
}
def gitBranch = new ByteArrayOutputStream()
project.exec {
def gitCmd = "git symbolic-ref --short -q HEAD || git branch -rq --contains "+getGitHash()+" | sed -e '2,\$d' -e 's/\\(.*\\)\\/\\(.*\\)\$/\\2/' || echo 'master'"
commandLine "bash", "-c", "${gitCmd}"
standardOutput = gitBranch
}
`` `
git branch -vv | grep 'hardcode-branch-name'
# "git rev-parse --abbrev-ref head" will get your current branch name
# $(git rev-parse --abbrev-ref head) save it as string
# find the tracking branch by grep filtering the current branch
git branch -vv | grep $(git rev-parse --abbrev-ref head)
В этой теме за четвертый квартал 2023 года обсуждаются крайние случаи:
- свежий пустой клонированный репозиторий
- или несуществующий местный филиал
не работает для свежего клона пустого репозитория
git for-each-ref --format="%(upstream:short)" refs/heads/master
ничего не выводит, в то время как
git status -b --no-ahead-behind --porcelain=v2
результаты
# branch.oid (initial) # branch.head master # branch.upstream origin/master
Т.е. он выводит правильную восходящую ветвь.
Но Джефф Кинг (Пефф) отвечает:
Я думаю, что это напечатает "
gone
", если восходящая ветвь пропала.
Но в этом случае отсутствует фактическая локальная ветвь. Иfor-each-ref
вообще не будет показывать запись для ссылки, которая не существует.
"refs/heads/master
» в вашей командной строке не ссылка, а шаблон, и этот шаблон ничему не соответствует. Итак, он работает так, как задумано.Я думаю, что более прямым инструментом было бы:
git rev-parse --symbolic-full-name master@{upstream}
Это убеждает
branch_get_upstream()
чтобы вернуть желаемое значение, но, к сожалению, оно где-то теряется в процессе разрешения, и мы выдаем ошибку. Возможно, это ошибка (с--symbolic
или--symbolic-full-name
, я думаю, было бы нормально разрешать имена, даже если они ни на что не указывают, но возможно, что это будет иметь и другие неожиданные побочные эффекты).
$ git remote --verbose
(или же)
$ git remote --v
(или же)
$ git remote -vv
(или) Узнать подробнее об удаленной ветке и Головной ветке
$ git remote show origin
Чтобы узнать о конкретном удаленном филиале и головном филиале
$ git remote show origin | grep master
Username for 'https://github.com': Pra.....@9
HEAD branch: master
master tracked
master merges with remote master
master pushes to master (up to date)