See also:
How can I see which Git branches are tracking which remote / upstream branch?
Как я могу узнать, какую удаленную ветку отслеживает локальная ветка?
Нужно ли мне анализировать вывод git config
или есть команда, которая сделает это за меня?
Согласен, это определенно не должно быть обманом. Он задает что-то совершенно иное, чем связанный вопрос
Я использую EasyGit (он же «например») как сверхлегкую оболочку поверх (или сбоку) Git. В EasyGit есть подкоманда «info», которая дает вам все виды суперполезной информации, включая текущую ветку удаленного отслеживания веток. Вот пример (где имя текущей ветки - «foo»):
pknotz@s883422: (foo) ~/workspace/bd $ eg info Total commits: 175 Local repository: .git Named remote repositories: (name -> location) origin -> git://sahp7577/home/pknotz/bd.git Current branch: foo Cryptographic checksum (sha1sum): bd248d1de7d759eb48e8b5ff3bfb3bb0eca4c5bf Default pull/push repository: origin Default pull/push options: branch.foo.remote = origin branch.foo.merge = refs/heads/aal_devel_1 Number of contributors: 3 Number of files: 28 Number of directories: 20 Biggest file size, in bytes: 32473 (pygooglechart-0.2.0/COPYING) Commits: 62
Я не знаю, считается ли это анализом вывода git config, но это определит URL-адрес пульта, который отслеживает мастер:
$ git config remote.$(git config branch.master.remote).url
Или git config branch.$(git symbolic-ref -q HEAD).remote
, если вы просто хотите, чтобы имя удаленного устройства отслеживалось в ветви ток - git config remote.$(git config branch.$(git symbolic-ref -q HEAD).remote).url
для URL-адреса.
Мне нужно было добавить опцию --short
, чтобы она работала. Итак, для получения удаленного имени текущей ветки: git config branch.$(git symbolic-ref -q --short HEAD).remote
и для получения URL-адреса удаленной текущей ветки: git config remote.$(git config branch.$(git symbolic-ref -q --short HEAD).remote).url
Обновлять: Ну, прошло несколько лет с тех пор, как я это опубликовал! Для моей конкретной цели сравнения HEAD с восходящим потоком я теперь использую @{u}
, который является ярлыком, который ссылается на HEAD ветки отслеживания восходящего потока. (См. https://git-scm.com/docs/gitrevisions#gitrevisions-emltbranchnamegtupstreamemegemmasterupstreamememuem).
Оригинальный ответ: Я тоже столкнулся с этой проблемой. Я часто использую несколько пультов в одном репозитории, и легко забыть, по какому из них отслеживается ваша текущая ветка. И иногда это полезно знать, например, когда вы хотите просмотреть свои локальные коммиты через git log remotename/branchname..HEAD
.
Все это хранится в переменных конфигурации git, но вам не нужно анализировать вывод конфигурации git. Если вы вызовете 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
Это было очень полезно при создании псевдонима для переназначения моей текущей ветки. Спасибо!
Также полезно для нашего псевдонима «fastforward», который продвигает локальную ветвь отслеживания к удаленному, пока выполняется операция быстрой перемотки вперед.
На самом деле я обнаружил, что этот git name-rev --name-only HEAD
не скажет вам, в какой ветке вы на самом деле находитесь. Для этого я просто использовал git branch | grep '^\*' | cut -d' ' -f2
Спасибо! В других ответах на подобные вопросы не упоминался псевдоним / ярлык @{u}
, и это именно то, что я искал! Нет причин сравнивать с основной веткой, если вы хотите только определить, нужно ли вам тянуть или нет.
@{u}
- это бомба. И существует с версии 1.7.0, а это означает, что, если он недоступен в git, который кто-то использует в 2018 году, его, вероятно, нужно обновить.
Лучше, чем git name-rev
для определения LOCAL_BRANCH, является LOCAL_BRANCH=$(git symbolic-ref -q HEAD)
(как показано в ответе @rubo77)
Используйте symbolic-ref --short HEAD
для отдельного слова, чтобы описать текущую ветвь.
TRACKING_REMOTE
fall back to origin
if the remote
config is not defined. Also, REMOTE_URL
isn't cognizant of url.<base>.insteadOf
. See этот ответ for the resolution.
Я думаю, что 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)
Мне нужна команда, которая обнаруживает является ветвью восходящего потока, поэтому использование origin в качестве входных данных делает предположение, поэтому это не сработает для меня
Но это ДЕЙСТВИТЕЛЬНО отвечает на OP. Команда git remote show origin
показывает вам локальные ветки и то, что они отслеживают как для push, так и для pull.
@dudewad Я думаю, дело в том, что эта команда предполагает, что пульт называется origin
, хотя на самом деле это может быть что угодно (например, несколько пультов с разными ветвями, отслеживающими ветки с разных пультов).
Два варианта:
% 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
Хороший! Первый дает неприятные ошибки, если ничего не отслеживается, а второй особенно полезен при написании скриптов. Кстати, %(refname:short)
- это имя текущего справочника --format
.
Отлично! Я удивлен, что второй вариант работает на моей машине быстрее. Кажется, что git вызывается дважды, но он точно работает быстрее. Есть идеи, почему это так?
Потрясающий! Не могли бы вы указать мне на документы, в которых используется @ {u}? Не знаком и хотел бы понять это лучше.
git help revisions
(одна из малоизвестных, но наиболее полезных частей документации) и найдите upstream
.
Это должно работать в Windows? Я получаю эту ошибку в PowerShell: Missing '=' operator after key in hash literal.
@pilau, я думаю, вам нужно выйти из %
.
Управляющий символ PowerShell - обратная кавычка, а не обратная косая черта. Может, это поможет. Если вы найдете реальное решение, опубликуйте его!
Этот ответ намного лучше, чем два ответа над ним, особенно если вы хотите сделать что-то вроде git diff `git rev-parse --abbrev-ref --symbolic-full-name @{upstream}`
.
Это действительно полезно echo 'git for-each-ref --format=\'%(refname:short) -> %(upstream:short)\' refs/heads/' > ~/bin/git-show-upstream; chmod +x ~/bin/git-show-upstream
Если вы хотите узнать восходящий поток для какой-либо другой ветки, вариант второго выбора: git for-each-ref --format='%(upstream:short)' $(git rev-parse --symbolic-full-name SOMEBRANCH)
, заменяющий SOMEBRANCH на имя ветки или "HEAD" для текущей ветки.
Важно помнить, что ветвь отслеживания не обязательно должна быть удаленной.
В случае, если ничего не отслеживается, вы можете избежать неприятного сообщения об ошибке, перенаправив поток ошибок: git rev-parse --abbrev-ref --symbolic-full-name @{u} 2>/dev/null
Мне пришлось добавить круглые скобки, чтобы избежать длинного списка в случае, если символическая ссылка пуста: git for-each-ref --format='%(upstream:short)' "$(git symbolic-ref -q HEAD)"
@Tino уродливые ошибки? Я получаю fatal: no upstream configured for branch '<branchname>'
, что является настолько фотогеничной ошибкой, на которую я мог надеяться. (Честно говоря, был уродливым еще в 12 году, когда был написан этот комментарий)
Если бы я задал этот вопрос, это был бы мой принятый ответ. Это действительно удобно, если вы используете его в автоматическом скрипте. Также см. Это: stackoverflow.com/a/32888639/1411958
Я использую этот псевдоним
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
Здесь - это команда, которая дает вам все ветви отслеживания (настроенные для 'pull'), см.:
$ git branch -vv
main aaf02f0 [main/master: ahead 25] Some other commit
* master add0a03 [jdsumsion/master] Some commit
Вам нужно пробираться через SHA и любые длинные сообщения фиксации, но их быстро набирать, и я получаю ветви отслеживания, выровненные по вертикали в 3-м столбце.
Если вам нужна информация о конфигурации «выталкивания» и «выталкивания» для каждой ветви, см. Другой ответ на git remote show origin
.
Обновлять
Начиная с git версии 1.8.5, вы можете отображать восходящую ветку с git status
и git status -sb
.
Этот вывод более прямой, чем git branch -av
или git remote show origin
, которые дают вам МНОГО данных, а не только отслеживаемый пульт.
Кстати, новейшие версии git (1.8.5.x) теперь также показывают восходящую ветвь во время git status
и git status -sb
, поэтому после обновления до 1.8.5.x этот вопрос (и ответ) не имеет значения.
Хотя это дает вам информацию, которую вы хотите, я бы не согласился, так как это правильный ответ. Это ответ так же, как если бы кто-то из словаря ответил «как пишется XYZ». В данном случае вы хотите ИСПОЛЬЗОВАТЬ полученный ответ (имя ветки) для некоторой операции. Этот ответ только помогает мне визуально увидеть его ... не дает вам чего-то, что можно использовать в следующей команде.
Вывод этой команды может вводить в заблуждение, поскольку сообщение фиксации может легко начинаться, например, с «[my-feature] ...». См. Ответ @ cdunn2001, в котором показана только ветвь восходящего потока (если есть) и ничего больше.
Я согласен с @ jonas-berlin - ответ cdunn2001 лучше, если вы хотите проанализировать результат - мой ответ хорош, если вы ищете простую команду и готовы визуально сканировать вывод
git branch -vv | grep '*'
Вы можете улучшить это, добавив --list $localBranchName
, и он будет выводить информацию только для этой конкретной ветви, например: git branch -vv --list master
Вы можете использовать git checkout
, т.е. «проверить текущую ветку». Это запретная операция с побочными эффектами для отображения информации отслеживания, если она существует, для текущей ветви.
$ git checkout
Your branch is up-to-date with 'origin/master'.
Другой простой способ - использовать
cat .git/config
в репозитории git
В нем будут перечислены подробности о местных филиалах.
Хорошо работает в Linux. Не будет работать в Windows, если в командной строке не используется Unix (например, cygwin или git bash).
В Windows просто используйте type .git/config
вместо cat .git/config
, конечно, в простой командной строке ..
Следующая команда будет ссылаться на текущую вилку удаленного источника
git remote -v
Чтобы добавить удаленный путь,
git remote add origin path_name
здесь вы не находите удаленный путь - вы добавляете
Другой метод (спасибо osse), если вы просто хотите узнать, существует он или нет:
if git rev-parse @{u} > /dev/null 2>&1
then
printf "has an upstream\n"
else
printf "has no upstream\n"
fi
Какой язык? Это похоже на сценарий оболочки Linux, но не дает никакой другой информации или контекста.
Еще один способ
git status -b --porcelain
Это даст вам
## BRANCH(...REMOTE)
modified and untracked files
git branch -r -vv
перечислит все ветки, включая удаленные.
Местные отделения и их пульты.
git branch -vv
Все отделения и пульты слежения.
git branch -a -vv
Посмотрите, где локальные ветки явно настроены для push и pull.
git remote show {remote_name}
Это правильный ответ. Например, git remote show origin
действительно показывает URL-адрес моего пульта дистанционного управления.
Если вы используете 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
Это покажет Только текущую ветку, в которой вы находитесь:
$ 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
Улучшая этот ответ, я придумал эти псевдонимы .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
какой это язык?
@ Дэн Фаррелл: оболочка. Псевдонимы, начинающиеся с! используйте / bin / sh. Двойные кавычки указаны для конфигурационного файла git.
Если вы хотите найти восходящий поток для ветки Любые (а не только тот, который вы используете), вот небольшая модификация ответа @ cdunn2001:
git rev-parse --abbrev-ref --symbolic-full-name YOUR_LOCAL_BRANCH_NAME@{upstream}
Это даст вам имя удаленной ветки для локальной ветки с именем YOUR_LOCAL_BRANCH_NAME
.
Перечисляет как локальные, так и удаленные ветки:
$ git branch -ra
Выход:
feature/feature1
feature/feature2
hotfix/hotfix1
* master
remotes/origin/HEAD -> origin/master
remotes/origin/develop
remotes/origin/master
Вы можете попробовать это:
git remote show origin | grep "branch_name"
branch_name
необходимо заменить на вашу ветку
Что произойдет, если имя вашей ветки также совпадает с другими ветками? Что происходит, когда имя вашей ветки совпадает с другим текстом в выводе git remote show origin
- если оно называется merges
или configure
?
не понял тебя. Вы имеете в виду несколько веток с одинаковыми именами?
Примеры «соответствует другим ветвям»: текущая ветка - «foo», но есть также «foobar», которому будет соответствовать grep; текущая ветка - «v3.4», но .
в регулярном выражении означает любой символ, поэтому будет соответствовать «v314» ...
git branch -vv | grep 'BRANCH_NAME'
git branch -vv
: В этой части будут показаны все локальные ветки вместе с их восходящей ветвью.
grep 'BRANCH_NAME'
: он отфильтрует текущую ветвь из списка ветвей.
Вывод 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
).
Попробовав все решения здесь, я понял, что ни одно из них не годится во всех ситуациях:
Эта команда получает все имена:
git branch -a --contains HEAD --list --format='%(refname:short)'
Для моего приложения мне пришлось отфильтровать ссылки HEAD и master, отдать предпочтение удаленным ссылкам и убрать слово origin /. а затем, если это не было найдено, используйте первую ссылку без HEAD, в которой не было /
или (
.
$ 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)
Блин. Это нет точный дубликат. Это подмножество другого, но есть и другие способы ответить на вопрос, например
git remote show origin
. Основной ответ на другой вопрос - это сценарий bash, обернутый здесь вокруг простого ответа, который может быть полезен для некоторых. Надеюсь, этот вопрос не будет полностью закрыт.