Дізнайтеся, яку віддалену гілку відстежує місцева гілка


842

Дивіться також:
Як я можу побачити, які гілки Git відстежують, яку віддалену / верхню гілку?

Як я можу дізнатися, яку віддалену гілку відстежує місцева гілка?

Чи потрібно аналізувати git configвихід, чи є команда, яка зробила б це для мене?


18
Шиш. Це не точний дублікат. Це підмножина іншого, але є й інші способи вирішити питання, наприклад git remote show origin. Основна відповідь в іншому запитанні - це сценарій башти, обгорнутий навколо простої відповіді, яка може бути корисною для деяких. Сподіваємось, це питання не буде повністю закритим.
cdunn2001

5
Домовились, це точно не повинно бути дурнем. Це задає щось зовсім інше, ніж пов'язане питання
Адам Баткін

Відповіді:


1002

Ось команда, яка дає всі гілки відстеження (налаштовані для '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.


Оновлення

Починаючи з версії 1.8.5 ви можете показати гілку вгору за допомогою git statusтаgit status -sb


6
Цей вихід є більш прямим, ніж git branch -avабо git remote show origin, що дає вам багато даних, а не лише відслідковане віддалене
SimplGy

60
BTW, новітні версії git (1.8.5.x) також тепер показують гілку вгору протягом потоку git statusі git status -sb- тому після оновлення до 1.8.5.x це питання (і відповідь) не має значення.
jdsumsion

11
Хоча це дає вам інформацію, яку ви хочете, я би не погодився, оскільки це правильна відповідь. Це відповідь так само, як давати комусь словник відповіді "як ти пишеш XYZ". У конкретному випадку ви хочете використати отриману відповідь (назва гілки) для певної операції. Ця відповідь лише допомагає мені візуально бачити це ... не дає вам чогось корисного в наступній команді.
UpAndAdam

Виведення цієї команди може бути оманливим, оскільки повідомлення про фіксацію може легко починатися з, наприклад, "[моя-особливість] ...". Будь ласка, дивіться відповідь @ cdunn2001, яка показує лише гілку верхнього течії (якщо така є) та нічого іншого.
Йонас Берлін

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
Приємно! Перший дає потворні помилки на випадок, якщо нічого не відстежується, а другий особливо корисний для сценаріїв. BTW %(refname:short)- це ім'я поточного номера в межах --format.
Тіно

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

15
Ця відповідь набагато краща, ніж дві відповіді над нею, особливо якщо ви хочете зробити щось на кшталтgit diff `git rev-parse --abbrev-ref --symbolic-full-name @{upstream}`
Цзянь

2
Це дійсно корисноecho 'git for-each-ref --format=\'%(refname:short) -> %(upstream:short)\' refs/heads/$1' > ~/bin/git-show-upstream; chmod +x ~/bin/git-show-upstream
albfan

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" як вхідного сигналу робить припущення, тож це для мене не працює
Олександр Міллз

1
Але це відповідає ВП. Команда git remote show originпоказує локальні гілки та те, що вони відстежують як для натискання, так і для витягування.
dudewad

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

74

Оновлення: Ну, минуло кілька років, як я опублікував це! Для моєї конкретної мети порівняння HEAD з висхідним потоком я зараз використовую @{u}, що є ярликом, який відноситься до HEAD гілки відстеження вгору. (Див. Https://git-scm.com/docs/gitreitions#gitreitions-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

2
Це було дуже корисно, щоб створити псевдонім для відновлення даних, що б там не було. Дякую!
Джастін Спар-Саммерс

Так само корисно для нашого "швидкого переходу" псевдонім, який буде пересувати локальну гілку відстеження до віддаленого, доки операція буде швидкою вперед.
Альтрей

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

1
Дякую! Інші відповіді на подібні запитання не згадували @{u}псевдонім / ярлик, і саме це я шукав! Немає підстав порівнювати з головним відділенням, якщо ви хочете лише визначити, потрібно тягнути чи ні.
Дан М.

1
@{u}це бомба. І це вже з 1.7.0, що означає, що якщо він не доступний в git, який хтось використовує у 2018 році, вони, ймовірно, належать до оновлення.
Кріс Кліленд

48

Місцеві відділення та їх пульти.

git branch -vv 

Усі відділення та відстеження віддалено.

git branch -a -vv

Подивіться, де місцеві гілки явно налаштовані для натискання та потягу.

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, але це визначить URL-адресу віддаленого пристрою, який відстежує майстер:

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

Або git config branch.$(git symbolic-ref -q HEAD).remoteякщо ви просто хочете, щоб ім'я віддаленого відстежувалася з поточного branch- 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 repo

Тут буде вказано детальну інформацію про місцеві відділення


Добре працює в 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?
Tom Swirly

не отримав тебе. ви маєте на увазі кілька гілок, що мають однакові назви
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 має підкоманду "інформація", яка надає вам всіляку корисну інформацію, включаючи поточну гілку віддаленого відстеження. Ось приклад (де поточна назва гілки - "foo"):

pknotz @ s883422: (foo) ~ / робоча область / bd
$ напр. інформація
Всього комісій: 175
Місцеве сховище: .git
Іменовані віддалені сховища: (назва -> місцезнаходження)
  походження -> git: //sahp7577/home/pknotz/bd.git
Поточна галузь: foo
  Криптографічна контрольна сума (sha1sum): bd248d1de7d759eb48e8b5ff3bfb3bb0eca4c5bf
  Витягнути / натиснути сховище за замовчуванням: походження
  Параметри витягування та натискання за замовчуванням:
    відділення.foo.remote = походження
    відділення.foo.merge = refs / heads / aal_devel_1
  Кількість учасників: 3
  Кількість файлів: 28
  Кількість каталогів: 20
  Найбільший розмір файлу, в байтах: 32473 (pygooglechart-0.2.0 / КОПІЄННЯ)
  Коміти: 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
@Dan Farrell: оболонка. Псевдоніми починаються з! використання / бін / ш. Подвійні лапки наведені для конфігураційного файлу 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 віддалений -v

Щоб додати віддалений шлях,

git віддалене додати початкове ім'я path_name


тут ви не знаходите віддаленого шляху - ви додаєте
serup
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.