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


845

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

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

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


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

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

Ответы:


1006

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


6
Этот вывод является более прямым, чем git branch -avили git remote show origin, что дает вам МНОГО данных, а не только отслеживаемый пульт
SimplGy

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

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

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

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

372

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

% 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

12
Ницца! Первая выдает ужасные ошибки в случае, если ничего не отслеживается, а вторая особенно полезна для сценариев. КСТАТИ %(refname:short)это имя текущей ссылки в --format.
Тино

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

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

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

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

220

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

3
Мне нужна команда, которая обнаруживает ветвь вверх по течению, поэтому использование 'origin' в качестве входных данных делает предположение, так что это не работает для меня
Alexander Mills

1
Но это отвечает ОП. Команда git remote show originпоказывает вам локальные ветви и то, что они отслеживают для push и pull.
dudewad

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

74

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

2
Это было очень полезно при создании псевдонима, чтобы перебазировать мою текущую ветку. Спасибо!
Джастин Спар-Саммерс

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

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

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

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

48

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

git branch -vv 

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

git branch -a -vv

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

git remote show {remote_name}

21

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

$ 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

19

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

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

17

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

13

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

git status -b --porcelain

Это даст вам

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

10

Еще один простой способ заключается в использовании

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

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


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

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

9

Другой метод (спасибо 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

8

git branch -vv | grep 'BRANCH_NAME'

git branch -vv : Эта часть покажет все локальные ветви вместе с их веткой вверх по течению.

grep 'BRANCH_NAME' : Он отфильтрует текущую ветку из списка веток.



5

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

$ git branch -ra

Вывод:

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

3

Выходные данные фарфора git-status (машиночитаемые) 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).


2

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

git rev-parse --abbrev-ref --symbolic-full-name YOUR_LOCAL_BRANCH_NAME@{upstream}

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


2

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

git remote show origin | grep "branch_name"

branch_name нужно заменить на вашу ветку


Что произойдет, если имя вашей ветви совпадает с именем других ветвей? Что происходит, когда имя вашей ветки совпадает с другим текстом в выводе git remote show origin- если он называется mergesили configure?
Том

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

1

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

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


0

Я использую EasyGit (он же «например») в качестве суперлегкого обертки поверх (или вдоль) Git. EasyGit имеет подкоманду «info», которая дает вам все виды супер полезной информации, включая текущую ветку удаленного отслеживания веток. Вот пример (где текущая ветвь называется «foo»):

pknotz @ s883422: (foo) ~ / workspace / bd
$ например информация
Всего совершенных: 175
Локальный репозиторий: .git
Именованные удаленные репозитории: (имя -> местоположение)
  Происхождение -> git: //sahp7577/home/pknotz/bd.git
Текущая ветка: foo
  Криптографическая контрольная сумма (sha1sum): bd248d1de7d759eb48e8b5ff3bfb3bb0eca4c5bf
  Пул-пуш-репозиторий по умолчанию: источник
  Параметры по умолчанию для пуш-пуша:
    branch.foo.remote = origin
    branch.foo.merge = refs /глав / aal_devel_1
  Количество участников: 3
  Количество файлов: 28
  Количество каталогов: 20
  Наибольший размер файла в байтах: 32473 (pygooglechart-0.2.0 / COPYING)
  Передает: 62

0

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

какой это язык?
Даниэль Фаррелл

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

0

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

-2

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

git remote -v

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

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


здесь вы не находите удаленный путь - вы добавляете
serup
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.