Узнайте, какую удаленную ветвь отслеживает локальная ветвь

See also:
How can I see which Git branches are tracking which remote / upstream branch?

Как я могу узнать, какую удаленную ветку отслеживает локальная ветка?

Нужно ли мне анализировать вывод git config или есть команда, которая сделает это за меня?

Блин. Это нет точный дубликат. Это подмножество другого, но есть и другие способы ответить на вопрос, например git remote show origin. Основной ответ на другой вопрос - это сценарий bash, обернутый здесь вокруг простого ответа, который может быть полезен для некоторых. Надеюсь, этот вопрос не будет полностью закрыт.

cdunn2001 18.11.2012 12:38

Согласен, это определенно не должно быть обманом. Он задает что-то совершенно иное, чем связанный вопрос

Adam Batkin 21.02.2013 07:32
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
931
2
606 612
24

Ответы 24

Я использую 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-адреса.

Anakhand 16.11.2019 03:59

Мне нужно было добавить опцию --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

Nelson 24.04.2020 22:14

Обновлять: Ну, прошло несколько лет с тех пор, как я это опубликовал! Для моей конкретной цели сравнения 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

Это было очень полезно при создании псевдонима для переназначения моей текущей ветки. Спасибо!

Justin Spahr-Summers 17.01.2012 12:19

Также полезно для нашего псевдонима «fastforward», который продвигает локальную ветвь отслеживания к удаленному, пока выполняется операция быстрой перемотки вперед.

Altreus 25.07.2012 14:02

На самом деле я обнаружил, что этот git name-rev --name-only HEAD не скажет вам, в какой ветке вы на самом деле находитесь. Для этого я просто использовал git branch | grep '^\*' | cut -d' ' -f2

Altreus 25.07.2012 15:41

Спасибо! В других ответах на подобные вопросы не упоминался псевдоним / ярлык @{u}, и это именно то, что я искал! Нет причин сравнивать с основной веткой, если вы хотите только определить, нужно ли вам тянуть или нет.

Dan M. 15.10.2017 04:27

@{u} - это бомба. И существует с версии 1.7.0, а это означает, что, если он недоступен в git, который кто-то использует в 2018 году, его, вероятно, нужно обновить.

Chris Cleeland 04.04.2018 19:27

Лучше, чем git name-rev для определения LOCAL_BRANCH, является LOCAL_BRANCH=$(git symbolic-ref -q HEAD) (как показано в ответе @rubo77)

qneill 05.09.2018 18:15

Используйте symbolic-ref --short HEAD для отдельного слова, чтобы описать текущую ветвь.

Tom Hale 19.10.2018 18:32
Осторожность: this doesn't have 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.
Tom Hale 19.10.2018 19:36

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

Alexander Mills 13.03.2016 11:01

Но это ДЕЙСТВИТЕЛЬНО отвечает на OP. Команда git remote show origin показывает вам локальные ветки и то, что они отслеживают как для push, так и для pull.

dudewad 23.02.2018 02:17

@dudewad Я думаю, дело в том, что эта команда предполагает, что пульт называется origin, хотя на самом деле это может быть что угодно (например, несколько пультов с разными ветвями, отслеживающими ветки с разных пультов).

Ruslan 15.10.2019 11:45

Два варианта:

% 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.

Tino 17.11.2012 19:27

Отлично! Я удивлен, что второй вариант работает на моей машине быстрее. Кажется, что git вызывается дважды, но он точно работает быстрее. Есть идеи, почему это так?

scicalculator 04.12.2012 11:00

Потрясающий! Не могли бы вы указать мне на документы, в которых используется @ {u}? Не знаком и хотел бы понять это лучше.

Matthew Ward 13.02.2013 22:57

git help revisions (одна из малоизвестных, но наиболее полезных частей документации) и найдите upstream.

cdunn2001 14.02.2013 09:38

Это должно работать в Windows? Я получаю эту ошибку в PowerShell: Missing '=' operator after key in hash literal.

pilau 31.07.2013 14:21

@pilau, я думаю, вам нужно выйти из %.

cdunn2001 02.08.2013 19:30

Управляющий символ PowerShell - обратная кавычка, а не обратная косая черта. Может, это поможет. Если вы найдете реальное решение, опубликуйте его!

cdunn2001 03.08.2013 05:09

Этот ответ намного лучше, чем два ответа над ним, особенно если вы хотите сделать что-то вроде git diff `git rev-parse --abbrev-ref --symbolic-full-name @{upstream}`.

Jian 09.05.2014 12:36

Это действительно полезно echo 'git for-each-ref --format=\'%(refname:short) -> %(upstream:short)\' refs/heads/' > ~/bin/git-show-upstream; chmod +x ~/bin/git-show-upstream

albfan 19.07.2014 22:43

Если вы хотите узнать восходящий поток для какой-либо другой ветки, вариант второго выбора: git for-each-ref --format='%(upstream:short)' $(git rev-parse --symbolic-full-name SOMEBRANCH), заменяющий SOMEBRANCH на имя ветки или "HEAD" для текущей ветки.

Jonas Berlin 03.07.2015 19:19

Важно помнить, что ветвь отслеживания не обязательно должна быть удаленной.

Jonas Berlin 03.07.2015 19:23

В случае, если ничего не отслеживается, вы можете избежать неприятного сообщения об ошибке, перенаправив поток ошибок: git rev-parse --abbrev-ref --symbolic-full-name @{u} 2>/dev/null

regulus 27.01.2016 04:58

Мне пришлось добавить круглые скобки, чтобы избежать длинного списка в случае, если символическая ссылка пуста: git for-each-ref --format='%(upstream:short)' "$(git symbolic-ref -q HEAD)"

Trendfischer 02.05.2019 17:48

@Tino уродливые ошибки? Я получаю fatal: no upstream configured for branch '<branchname>', что является настолько фотогеничной ошибкой, на которую я мог надеяться. (Честно говоря, был уродливым еще в 12 году, когда был написан этот комментарий)

ijoseph 16.08.2019 02:07

Если бы я задал этот вопрос, это был бы мой принятый ответ. Это действительно удобно, если вы используете его в автоматическом скрипте. Также см. Это: stackoverflow.com/a/32888639/1411958

Bhavesh Diwan 23.10.2020 08:13

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

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, которые дают вам МНОГО данных, а не только отслеживаемый пульт.

SimplGy 24.07.2013 06:18

Кстати, новейшие версии git (1.8.5.x) теперь также показывают восходящую ветвь во время git status и git status -sb, поэтому после обновления до 1.8.5.x этот вопрос (и ответ) не имеет значения.

jdsumsion 17.12.2013 23:32

Хотя это дает вам информацию, которую вы хотите, я бы не согласился, так как это правильный ответ. Это ответ так же, как если бы кто-то из словаря ответил «как пишется XYZ». В данном случае вы хотите ИСПОЛЬЗОВАТЬ полученный ответ (имя ветки) для некоторой операции. Этот ответ только помогает мне визуально увидеть его ... не дает вам чего-то, что можно использовать в следующей команде.

UpAndAdam 24.04.2015 20:52

Вывод этой команды может вводить в заблуждение, поскольку сообщение фиксации может легко начинаться, например, с «[my-feature] ...». См. Ответ @ cdunn2001, в котором показана только ветвь восходящего потока (если есть) и ничего больше.

Jonas Berlin 03.07.2015 19:11

Я согласен с @ jonas-berlin - ответ cdunn2001 лучше, если вы хотите проанализировать результат - мой ответ хорош, если вы ищете простую команду и готовы визуально сканировать вывод

jdsumsion 22.03.2016 22:11

git branch -vv | grep '*'

Swastik Padhi 14.11.2017 10:42

Вы можете улучшить это, добавив --list $localBranchName, и он будет выводить информацию только для этой конкретной ветви, например: git branch -vv --list master

Murmel 21.11.2018 12:51

Вы можете использовать git checkout, т.е. «проверить текущую ветку». Это запретная операция с побочными эффектами для отображения информации отслеживания, если она существует, для текущей ветви.

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

Другой простой способ - использовать

cat .git/config в репозитории git

В нем будут перечислены подробности о местных филиалах.

Хорошо работает в Linux. Не будет работать в Windows, если в командной строке не используется Unix (например, cygwin или git bash).

Contango 02.11.2017 14:00

В Windows просто используйте type .git/config вместо cat .git/config, конечно, в простой командной строке ..

khmarbaise 03.03.2018 22:11

Следующая команда будет ссылаться на текущую вилку удаленного источника

git remote -v

Чтобы добавить удаленный путь,

git remote add origin path_name

здесь вы не находите удаленный путь - вы добавляете

serup 29.11.2016 12:22

Другой метод (спасибо osse), если вы просто хотите узнать, существует он или нет:

if git rev-parse @{u} > /dev/null 2>&1
then
  printf "has an upstream\n"
else
  printf "has no upstream\n"
fi

Какой язык? Это похоже на сценарий оболочки Linux, но не дает никакой другой информации или контекста.

Suncat2000 10.10.2019 16:09

Еще один способ

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-адрес моего пульта дистанционного управления.

kingaj 08.07.2020 02:25

Если вы используете 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

какой это язык?

Daniel Farrell 25.10.2018 18:09

@ Дэн Фаррелл: оболочка. Псевдонимы, начинающиеся с! используйте / bin / sh. Двойные кавычки указаны для конфигурационного файла git.

Tom Hale 26.10.2018 20:33

Если вы хотите найти восходящий поток для ветки Любые (а не только тот, который вы используете), вот небольшая модификация ответа @ 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?

Tom Swirly 20.07.2019 17:25

не понял тебя. Вы имеете в виду несколько веток с одинаковыми именами?

xpioneer 23.07.2019 12:03

Примеры «соответствует другим ветвям»: текущая ветка - «foo», но есть также «foobar», которому будет соответствовать grep; текущая ветка - «v3.4», но . в регулярном выражении означает любой символ, поэтому будет соответствовать «v314» ...

Beni Cherniavsky-Paskin 18.06.2020 20:40

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).

Попробовав все решения здесь, я понял, что ни одно из них не годится во всех ситуациях:

  • работает в местных филиалах
  • работает на обособленных филиалах
  • работает под CI

Эта команда получает все имена:

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)

Другие вопросы по теме