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

Смотрите также:

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

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

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

 cdunn200118 нояб. 2012 г., 09:38
Sheesh. Этоне точный дубликат. Это подмножество других, но есть и другие способы сделать такой вопрос, какgit remote show origin, Основным ответом на другой вопрос является сценарий bash, обернутый вокруг простого ответа, который может быть полезен для некоторых. Надеюсь, этот вопрос не будет полностью закрыт.
 Adam Batkin21 февр. 2013 г., 04:32
Согласен, это определенно не должноне будь дураком. Это'задает нечто совершенно иное, чем связанный вопрос

Ответы на вопрос(18)

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

% 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
 cdunn200102 авг. 2013 г., 17:30
@pilau, я думаю, тебе нужно сбежать.%
 pilau02 авг. 2013 г., 21:15
@ cdunn2001 Спасибо, но это вызывает синтаксическую ошибку в PowerShell ...
 albfan19 июл. 2014 г., 20:43
Это действительно полезноecho 'git for-each-ref --format=\'%(refname:short) -> %(upstream:short)\' refs/heads/$1' > ~/bin/git-show-upstream; chmod +x ~/bin/git-show-upstream
 York19 апр. 2014 г., 16:14
Очень элегантно, большое спасибо
 regulus27 янв. 2016 г., 02:58
В случае, если ничего не отслеживается, вы можете избежать неприятного сообщения об ошибке, перенаправив поток ошибок:git rev-parse --abbrev-ref --symbolic-full-name @{u} 2>/dev/null
 pilau31 июл. 2013 г., 12:21
Это должно работать в Windows? Я получаю эту ошибку в PowerShell:Missing '=' operator after key in hash literal.
 Jian09 мая 2014 г., 10:36
Этот ответ намного лучше, чем два ответа выше, особенно если вы хотите сделать что-то вродеgit diff `git rev-parse --abbrev-ref --symbolic-full-name @{upstream}`
 Jonas Berlin03 июл. 2015 г., 18:19
Если вы хотите выяснить восходящий поток для какой-то другой ветки, вариант второго варианта:git for-each-ref --format='%(upstream:short)' $(git rev-parse --symbolic-full-name SOMEBRANCH) заменяя SOMEBRANCH на имя ветви, или "ГОЛОВА" для текущей ветки
 cdunn200114 февр. 2013 г., 06:38
git help revisions (одна из малоизвестных, но наиболее полезных частей документов) и поиск.upstream
 cdunn200103 авг. 2013 г., 03:09
Escape-символ PowerShellкавычка, а не обратный слеш. Может быть, это поможет. Если вы найдете реальное решение, пожалуйста, опубликуйте его!
 Trendfischer02 мая 2019 г., 16:48
Мне пришлось добавить круглые скобки, чтобы избежать длинного списка в случае, если символический ref пуст:git for-each-ref --format='%(upstream:short)' "$(git symbolic-ref -q HEAD)"
 UpAndAdam24 апр. 2015 г., 19:55
Этот ответ СООО намного лучше, чем приведенные выше ответы, что это смущает.
 Tino17 нояб. 2012 г., 16:27
Ницца! Первая выдает ужасные ошибки в случае, если ничего не отслеживается, а вторая особенно полезна для написания сценариев. КСТАТИ%(refname:short) это имя текущей ссылки в.--format
 Jonas Berlin03 июл. 2015 г., 18:23
Важно помнить, что ветвь отслеживания не обязательно должна быть удаленной.
 smwikipedia09 июл. 2017 г., 16:09
Это точный ответ. Но трудно запоминающийся ответ.
 Matthew Ward13 февр. 2013 г., 19:57
Потрясающие! Можете ли вы указать мне на документы, где @ {u} вступает в игру? Не знаком и хотел бы понять это лучше.
 scicalculator04 дек. 2012 г., 08:00
Это замечательно! Я удивлен, что второй вариант работает быстрее на моей машине. Кажется, что 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
 Tom Hale26 окт. 2018 г., 19:33
@ Дэн Фаррелл: оболочка. Псевдонимы, начинающиеся с a! используйте / bin / sh. Двойные кавычки указаны для git 'Конфигурационный файл.
 Daniel Farrell25 окт. 2018 г., 17:09
какой это язык?

Местные филиалы и их пульты.

git branch -vv 

Все филиалы и трекинг пультов.

git branch -a -vv

Посмотрите, где локальные ветви явно настроены для push и pull.

git remote show {remote_name}

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)
 dudewad23 февр. 2018 г., 00:17
Но это отвечает на ФП. Командаgit remote show origin показывает вам местные филиалы и то, что они отслеживают для push и pull.
 Alexander Mills13 мар. 2016 г., 09:01
Мне нужна командаобнаруживает ветвь вверх по течению, так что используяпроисхождение так как ввод делает предположение, так что это не работает для меня
 UpAndAdam24 апр. 2015 г., 19:53
Опять же, это не должен быть правильный ответ, и ничто не отличается от ответа над ним, который является более правильным для рассматриваемого случая, когда вопрос задавался о местных филиалах.

я используюEasyGit (a.k.a. "например") в качестве суперлегкой обертки сверху (или вдоль стороны) Git. EasyGit имеет "Информация" подкоманда, которая дает вам все виды супер полезной информации, включая текущую ветку удаленного отслеживания веток. Вот's пример (где текущее имя ветки "Foo»):

[email protected]: (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
 Ville11 дек. 2013 г., 20:29
URL-адрес EasyGit изменился ...теперь вgitorious.org/eg

cat .git/config в git-репо

Это будет список деталей для местных отделений

 khmarbaise03 мар. 2018 г., 20:11
В Windows просто используйтеtype .git/config вместоcat .git/config конечно на простой командной строке ..
 Contango02 нояб. 2017 г., 12:00
Прекрасно работает на Linux. Не будет работать в Windows, если не в Unix-подобном приглашении (например, cygwin или git bash).

если вы просто хотите узнать, существует ли он:

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

Обновить: Ну, этоПрошло несколько лет с тех пор, как я написал это! Для моей конкретной цели сравнения HEAD с апстримом я сейчас использую@{u}, который является ярлыком, который ссылается на HEAD восходящей ветви отслеживания. (Увидетьhttps://git-scm.com/docs/gitrevisions#gitrevisions-emltbranchnamegtupstreamemegemmasterupstreamememuem ).

Оригинальный ответ: яМы тоже сталкивались с этой проблемой. Я часто использую несколько пультов в одном репозитории, и этоЛегко забыть, какой из ваших текущих филиалов отслеживает. И иногда этоЭто удобно знать, например, когда вы хотите посмотреть свои локальные коммиты через.git log remotename/branchname..HEAD

Все это хранится в переменных конфигурации git, но вы ненужно разобрать вывод 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
 Dan M.15 окт. 2017 г., 03:27
Спасибо! Другие ответы на подобные вопросы не делалине упомянуть@{u} псевдоним / ярлык иэто именно то, что я искал! Нет смысла сравнивать с основной веткой, если вы хотите только определить, нужно ли вам тянуть или нет.
 Altreus25 июл. 2012 г., 13:41
На самом деле я обнаружил этоgit name-rev --name-only HEAD победил'не скажу, какую ветку тына самом деле. Для этого я просто использовалgit branch | grep '^\*' | cut -d' ' -f2
 Tom Hale19 окт. 2018 г., 17:32
использованиеsymbolic-ref --short HEAD для одного слова, чтобы описать текущую ветку.
 Tom Hale19 окт. 2018 г., 18:36
Внимание: это неиметьTRACKING_REMOTE отступить кorigin еслиremote конфиг не определен. Также,REMOTE_URL ISN»т осведомлен оurl..insteadOf, Увидетьэтот ответ для разрешения.
 Chris Cleeland04 апр. 2018 г., 18:27
@{u} это бомба. И существует с 1.7.0, что означает, что еслине доступны в GIT, который кто-то использует в 2018 году, онивероятно, для обновления.
 Altreus25 июл. 2012 г., 12:02
Также полезно для нашего концертаперемотка вперед' псевдоним, который 'Передвинем локальную ветвь отслеживания на удаленный, пока операция выполняется в ускоренном режиме.
 Justin Spahr-Summers17 янв. 2012 г., 09:19
Это было очень полезно при создании псевдонима, чтобы перебазировать мою текущую ветку. Спасибо!
 qneill05 сент. 2018 г., 17:15
Лучше чемgit name-rev определить, что LOCAL_BRANCHLOCAL_BRANCH=$(git symbolic-ref -q HEAD) (как показано в @ rubo77 'с ответом)
git branch -r -vv

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

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

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

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

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 config, но это определит URL удаленного, который отслеживает мастер:

$ git config remote.$(git config branch.master.remote).url

Это покажет вам ветку, на которой вы находитесь:

$ 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 remote -v

Для добавления удаленного пути,

git remote добавить источник path_name

 serup29 нояб. 2016 г., 10:22
здесь вы не находите удаленный путь - вы добавляете
 Robin-Hoodie27 авг. 2015 г., 10:20
Не уверен, почему за это проголосовали, поскольку это просто неправильный ответ. -1

любой ответвление (в отличие от того, на котором вы находитесь), вот небольшая модификация @ cdunn2001 'ответ:

git rev-parse --abbrev-ref --symbolic-full-name [email protected]{upstream}

Это даст вам имя удаленной ветви для локальной ветви с именем.YOUR_LOCAL_BRANCH_NAME

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

git status -b --porcelain

Это даст вам

## BRANCH(...REMOTE)
modified and untracked files

Вот это команда, которая дает вам все ветви отслеживания (настроено для 'вытащить'), увидеть:

  main   aaf02f0 [main/master: ahead 25] Some other commit
* master add0a03 [jdsumsion/master] Some commit

Вам нужно пройтись по SHA и любым сообщениям коммита с длинным переносом, но этоs быстро набрать, и я получаю, что ветви отслеживания выровнены по вертикали в 3-м столбце.

Если вам нужна информация об обоихвытащить' а также 'От себя' Конфигурация для каждой ветви, см. другой ответ на.git remote show origin

Обновить

Начиная с git версии 1.8.5, вы можете показать ветку upstream с помощьюgit status а такжеgit status -sb

 jdsumsion17 дек. 2013 г., 20:32
Кстати, новейшие версии git (1.8.5.x) также теперь показывают ветку upstream во времяgit status а такжеgit status -sb - поэтому после обновления до 1.8.5.x этот вопрос (и ответ) не имеет значения.
 CrakC14 нояб. 2017 г., 08:42
git branch -vv | grep '*'
 Linh06 июн. 2015 г., 00:43
этот ответ должен быть перемещен наверх.
 UpAndAdam24 апр. 2015 г., 19:52
Хотя это даст вам информацию, которую вы хотите, я бы не согласился, так как это правильный ответ. Это's ответ таким же образом, давая кому-то словарь ответы "как пишется XYZ?, В данном случае вы хотите ИСПОЛЬЗОВАТЬ полученный ответ (название ветви) для какой-либо операции. Этот ответ только помогает мне увидеть его визуально ... нене дать вам что-то полезное в последующей команде.
 SimplGy24 июл. 2013 г., 04:18
Этот вывод более прямой, чемgit branch -av или жеgit remote show origin, которые дают вам много данных, а не только отслеживаемый пульт
 BHS30 окт. 2014 г., 11:42
Да. Я второй это. Это правильный ответ. Здесь master отслеживает удаленный jdsumsion / master в приведенном выше примере.
 jdsumsion22 мар. 2016 г., 20:11
Я согласен с @ jonas-berlin - cdunn2001 's ответ лучше, если вы хотите разобрать результат - мой ответ хорош, если вы ищете простую команду и хотите визуально сканировать вывод
 Jonas Berlin03 июл. 2015 г., 18:11
Вывод этой команды может вводить в заблуждение, поскольку сообщение о коммите может легко начинаться, например, с "[моя особенность] ... ", Пожалуйста, смотрите @ cdunn2001 'Ответ, который показывает только ветвь вверх по течению (если есть) и ничего больше.
 Murmel21 нояб. 2018 г., 10:51
Вы можете улучшить это, добавив--list $localBranchName и он будет выводить информацию только для этой конкретной ветви, например:git branch -vv --list master

Ваш ответ на вопрос