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

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

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

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

Ответы

Ответ 1

Здесь - это команда, которая дает вам все ветки отслеживания (сконфигурированные для '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

Ответ 2

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

% 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

Ответ 3

Я думаю, что 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)

Ответ 4

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

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

Все эти данные хранятся в переменных git config, но вам не нужно разбирать вывод конфигурации 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

Ответ 5

Локальные ветки и их пульты.

git branch -vv 

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

git branch -a -vv

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

git remote show {remote_name}

Ответ 6

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

$ 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

Ответ 7

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

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

Ответ 8

Я не знаю, учитывается ли это как синтаксический анализ вывода конфигурации git, но это будет определять URL-адрес удалённого объекта, который мастер отслеживает:

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

Ответ 9

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

git status -b --porcelain

Это даст вам

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

Ответ 10

Еще один простой способ - использовать

cat .git/config в git repo

Здесь будут перечислены детали локальных ветвей

Ответ 11

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

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

Ответ 12

git branch -r -vv

отобразит все ветки, включая удаленный.

Ответ 13

Перечисляет как локальные, так и удаленные ветки:

$ git branch -ra

Выход:

  feature/feature1
  feature/feature2
  hotfix/hotfix1
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/master

Ответ 14

Если вы хотите найти восходящую ветку для любой ветки (в отличие от той, на которой вы находитесь), вот небольшое изменение в ответе @cdunn2001:

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

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

Ответ 15

Я использую EasyGit (a.k.a. "eg" ) как супермассивную упаковку поверх (или вдоль стороны) Git. У EasyGit есть подкоманда "info", которая дает вам все виды супер полезной информации, включая ветку удаленного отслеживания веток. Здесь пример (где текущее название ветки "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

Ответ 16

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

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

обратите внимание, что script также может использоваться для настройки отслеживания.

Более великие псевдонимы на https://github.com/orefalo/bash-profiles

Ответ 17

Вы можете попробовать это:

git remote show origin | grep "branch_name"

имя_в ветки нужно заменить на ветку ур

Ответ 18

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

Ответ 19

Улучшая этот ответ, я придумал эти псевдонимы .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

Ответ 20

Следующая команда будет удалять текущее fork, ссылаясь на

git remote -v

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

git удаленное добавление имени пути