Зробити існуючу гітку Git віддаленою гілкою?


3535

Я знаю, як зробити нову гілку, яка відслідковує віддалені гілки, але як зробити існуючу гілку для віддаленої гілки?

Я знаю, що я можу просто відредагувати .git/configфайл, але, здається, має бути простіший спосіб.


26
Як зазначено нижче, для існуючої гілки ви можете використовувати git push -u origin branch-name.
Загс

3
Якщо локальна гілка є поточною гілкою, а локальна гілка вже не відстежує віддалений, git pullчасто надсилатиме корисні повідомлення про відповідну команду для встановлення інформації відстеження
billrichards

57
Прикро, коли ви навчаєтеся git, щоб йому показали посилання на git-документацію. Ця документація, здається, написана для людей, які вже знають, що роблять з git.
Феліпе Альварес

9
станом на Git 2.10, спочатку слід замовити місце в місцевому відділенні, а потім зробити цеgit branch --set-upstream-to origin/<branch>
Махді Джавахері

2
--set-upstreamвидає помилку: fatal: the '--set-upstream' option is no longer supported. Please use '--track' or '--set-upstream-to' instead.так git branch --set-upstream-to origin/<branch name>працює і поточна команда.
Супер Джейд

Відповіді:


4268

Дано відділення fooта віддалене відділення upstream:

Станом на Git 1.8.0:

git branch -u upstream/foo

Або, якщо локальна філія fooне є поточною гілкою:

git branch -u upstream/foo foo

Або, якщо ви хочете вводити довші команди, вони еквівалентні двом вище:

git branch --set-upstream-to=upstream/foo

git branch --set-upstream-to=upstream/foo foo

Станом на Git 1.7.0:

git branch --set-upstream foo upstream/foo

Примітки:

  • Усі вищезазначені команди змусять локальну гілку fooвідстежувати віддалену гілку fooвід віддаленої upstream.
  • Старий (1.7.x) синтаксис застарілий на користь нового (1,8+) синтаксису. Новий синтаксис призначений для більш інтуїтивного та легшого запам’ятовування.
  • Визначення гілки вище за течією буде невдалою при запуску проти новостворених видалень, які ще не отримано. У такому випадку запускайте git fetch upstreamзаздалегідь.

Дивіться також: Чому мені потрібно постійно робити '--set-upstream'?


124
"Вгору за течією" назва дистанційного? тобто те, що більшість називатиме "походженням" за замовчуванням?
Ендрю Віт

172
@Andrew: Так. git branch --set-upstream master origin/masterбуло б еквівалентно тому, що робиться автоматично, коли ви спочатку клонуєте сховище.
Дан Ліплення

62
У відповідній примітці додавання цього до вашого gitconfig - дивовижне: "[push] за замовчуванням = відстеження" це зробить так, що натискання будуть йти туди ж, звідки
потягнуті

61
Я отримую "фатально: Неправильне ім'я об'єкта: 'origin / master'."
Йоахім

84
git push -u origin foo via
Бавовна

235

Ви можете зробити наступне (якщо припустити, що ви перевірені на майстер і хочете перейти до віддаленого майстра відділення):

Установіть "дистанційне", якщо у вас його ще немає

git remote add origin ssh://...

Тепер налаштуйте майстра, щоб знати, щоб відстежувати:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

І натисніть:

git push origin master

справді потрібен пульт і гілка в поштовху? Я маю на увазі, вам це потрібно лише в тому випадку, якщо ваша перевірена гілка не така, яку ви хочете натиснути, так?
Doppelganger

5
Так - але з пам'яті вам, можливо, знадобиться бути явним для першого натиску. Можна легко перевірити звичайно ... :)
Пол Хеддерлі

+1 Це відповідь для користувачів Windows, які застрягли в повідомленні msysgit "Попередній перегляд", який дорівнює 1,8. Дякую за це.
Іван

3
Це єдина відповідь, яка працювала на мене. Коли я спробував обслуговується відповідь, щоб встановити на вхід пульта дистанційного керування для існуючої гілки, я отримав: error: the requested upstream branch 'upstream/master' does not exist.
Стів К

4
@SteveK, найімовірніше, тому, що ваш вищий потік викликається, originа ні upstream.
umläute

160

Я роблю це як побічний ефект натискання з -uопцією, як в

$ git push -u origin branch-name

Еквівалентний довгий варіант --set-upstream.

git-branchКоманда також розуміє --set-upstream, але його використання може призвести до плутанини. Версія 1.8.0 змінює інтерфейс.

git branch --set-upstreamзастаріла і може бути видалена у відносно віддаленому майбутньому. git branch [-u|--set-upstream-to]було введено з більш безпечним порядком аргументів.

Це було спокусливо сказати git branch --set-upstream origin/master, але це підказує Git організувати локальну філію "origin / master" для інтеграції з перевіреною в даний час гілкою, що малоймовірно, що мав на увазі користувач. Параметр застарілий; використовуйте замість цього новий --set-upstream-to(з коротким і солодким -u) варіантом.

Скажіть, у вас є локальна fooфілія, і ви хочете, щоб вона обробляла цю гілку за тим самим назвою, що і її верхня частина. Зробіть це з

$ git branch foo
$ git branch --set-upstream-to=origin/foo

або просто

$ git branch --set-upstream-to=origin/foo foo

1
Це набагато краще рішення imo
Nils_e

--set-upstream-to=...це саме те, що я шукав.
Річард

54

Ви можете вважати цей git_remote_branchінструмент корисним. Він пропонує прості команди для створення, публікації, видалення, відстеження та перейменування віддалених гілок. Одна приємна особливість полягає в тому, що ви можете попросити grbкоманду пояснити, які команди git вона виконує.

grb explain create my_branch github
# git_remote_branch version 0.3.0

# List of operations to do to create a new remote branch and track it locally:
git push github master:refs/heads/my_branch
git fetch github
git branch --track my_branch github/my_branch
git checkout my_branch

3
grb - це рубіновий камінь, доступ до якого можна отримати, як пояснено в їхньому github
mcabrams

6
ОП задає питання щодо самого Git. Тому не запроваджуйте новий інструмент, мабуть, буде краще.
zeekvfu

grb - псевдонім для git-rebase в моїй установці macOS. Я цього не робив :)
Бен Сінклер

53

Насправді для прийнятої відповіді на роботу:

git remote add upstream <remote-url>
git fetch upstream
git branch -f --track qa upstream/qa
# OR:
git branch --set-upstream qa upstream/qa

Місцева гілка вже відстежувала гілку, тож можна припустити, що віддалене репо вже було додано.
Доппельгангер

Dopplerganger: Дивіться коментар Йоахіма до прийнятої відповіді. У будь-якому випадку припущення легко відрізняються - це те, що робить речі такими цікавими;)
Їжак

44

Я вважаю, що вже в Git 1.5.x ви могли зробити місцеву гілку $BRANCHвідстеження віддаленою гілкою origin/$BRANCH, як це.

З огляду на , що $BRANCHі origin/$BRANCHіснує, і ви в нині не перевірили $BRANCH(перемикач , якщо у вас є), зробіть наступне :

git branch -f --track $BRANCH origin/$BRANCH

Це відтворює $BRANCHяк галузь відстеження. У -fпритискає створення , незважаючи на $BRANCHіснуючі вже. --trackнеобов'язково, якщо встановлені звичайні параметри за замовчуванням (тобто параметр git-config branch.autosetupmergeє істинним).

Зауважте, якщо origin/$BRANCHвін ще не існує, ви можете створити його, натиснувши свій локальний $BRANCHу віддалене сховище за допомогою:

git push origin $BRANCH

Слідом за попередньою командою просування місцевої гілки в гілку відстеження.


1
git push origin $BRANCHбуло те, що я шукав.
Користувач

Після спроб всіляких рішень, включаючи налаштування вищевикладеного способу, як описано вище, нічого не вийшло. Все, що я хотів зробити, - це витягнути 1 новий фіксатор у свою локальну гілку з віддаленого, і я спочатку не відстежував настройки. Команда git branch -f --track $BRANCH origin/$BRANCHвиконує трюк.
DemitryT

38

1- оновіть ваші локальні метадані, використовуючи: git fetch - всі

введіть тут опис зображення

2- покажіть віддалені та локальні гілки, використовуючи: git branch -a , див. Наступний знімок екрана

введіть тут опис зображення

3- переключиться на цільову гілку, яку потрібно пов'язати з віддаленим: за допомогою

git checkout branchName

приклад:

введіть тут опис зображення

4- Зв’яжіть свою локальну гілку з віддаленою гілкою за допомогою:

гілка git --set-upstream-to nameOfRemoteBranch

NB: nameOfRemoteBranch : скопіювати з виходу кроку 2 "git гілка -r"

Приклад використання:

введіть тут опис зображення


1
Переважно легка та проста відповідь.
vibs2006

25

Обов’язково виконайте:

git config push.default tracking

щоб можна було виправити проблеми


1
Це може бути зручно. Однак ми можемо відзначити, що згідно з git-config(1)посібником, trackingце застарілий синонім upstream.
FooF

23

Редагування .git/config- це, мабуть, найпростіший та найшвидший спосіб. Ось так і роблять команди Git для обробки віддалених гілок.

Якщо ви не хочете вручну git configредагувати .git/configфайл з файлом (і це не так важко зробити), ви завжди можете це зробити ... але знову ж таки, це все-таки просто редагує файл.

Звичайно, є способи автоматичного відстеження віддаленої гілки при використанні git checkout(наприклад, передаючи --trackпрапор), але ці команди працюють з новими гілками, а не з існуючими.


18

Вкрай коротко

git branch --set-upstream yourLocalBranchName origin/develop

Це зробить вашу yourLocalBranchNameдоріжку віддаленою гілкою develop.


1
@Quincy Перевір відповідь greg - використовуй git push -u origin branch(або --set-upstream-to) замість цього
Тобіас Кіенцлер

@MadNik, в чому різниця між --set-upstreamі --track? Я не зовсім розумію, чому я повинен використовувати один над іншим.
Acumenus

15

Для 1.6.x це можна зробити за допомогою інструмента git_remote_branch :

grb track foo upstream

Це призведе до того, щоб Гіт fooвідстежував upstream/foo.


12

Я використовую таку команду (Припустимо, ваша локальна гілка гілки - "гілка-ім'я-локальна", а назва віддаленої гілки - "назва-гілка-віддалена"):

$ git branch --set-upstream-to=origin/branch-name-remote branch-name-local

Якщо і місцеві, і віддалені відділення мають одне ім’я, просто виконайте наступне:

$ git branch --set-upstream-to=origin/branch-name branch-name

Ви змінили "ім'я гілки" та "походження / ім'я гілки" в командному рядку. Вища течія виходить перед місцевими.
maharvey67

@ maharvey67 ви праві, дякую. Редагував відповідь.
yrazlik

Це було золото, дякую, ще й тому, що жоден із варіантів прийнятої відповіді не є нормальним, коли у назви філії є
косої риси

8

Ось, використовуючи githubта git version 2.1.4, просто робіть:

$ git clone git@github.com:user/repo.git

І пульти передаються itelsef, навіть якщо вони не пов'язані локально:

$ git remote show origin

* remote origin
  Fetch URL: git@github.com:user/repo.git
  Push  URL: git@github.com:user/repo.git
  HEAD branch: master
  Remote branches:
    develop tracked         <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    master  tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

Але, звичайно, досі немає місцевого відділення:

$ git branch
* master                  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Подивитися? Тепер, якщо ви просто розробити замовлення, воно зробить магію автоматично:

$ git checkout develop
Branch develop set up to track remote branch develop from origin.
Switched to a new branch 'develop'

Так легко!


Підсумок Просто запустіть ці 2 команди:

$ git clone git@github.com:user/repo.git
$ git checkout develop

1
Прекрасний приклад мого ідентичного випадку використання. Незважаючи на відсутність ознак локальної гілки «розвинути», коли я перевірив гілку «розвинути», ця гілка з’являється і магічно налаштована для відстеження віддаленої гілки «розвиватися» від походження. Я ціную покроковий приклад та пояснення!
ElliotPsyIT

8

Використовувати опцію '--Track'

  • Після git pull:

    git checkout --track <remote-branch-name>

  • Або:

    git fetch && git checkout <branch-name>


7

Для створення нової гілки ми могли використовувати наступну команду

 git checkout --track -b приклад походження / приклад 
Для створення вже створеної гілки, щоб створити зв’язок між віддаленим, а потім із цією гілкою, використовуйте команду нижче

 git гілка -u походження / віддалений-гілка-ім'я


5

Це не пряма відповідь на це питання, але я хотів залишити тут примітку для всіх, у кого, можливо, виникає така ж проблема, як і я, коли намагаються налаштувати гілку вище за течією.

Будьте уважні до push.default .

Для старих версій git за замовчуванням було відповідати , що може спричинити дуже небажану поведінку, якщо у вас є, наприклад:

Місцеве відділення "master" відстеження до походження / майстра

Віддалене відстеження гілки "upstream" до upstream / master

Якщо ви намагалися "git push", коли перебуваєте на гілці "upstream", git push.default, що відповідає , автоматично спробує об'єднати "master" локальної гілки у "upstream / master", викликаючи цілу масу хаосу.

Це дає більш розумну поведінку:

git config --global push.default upstream


Ви не залишали цього даремно. Дякую.
stefgosselin

4

Дещо пов’язаним чином я намагався додати віддалену гілку відстеження до вже існуючої гілки, але не мав доступу до цього віддаленого сховища в системі, куди я хотів додати цю віддалену гілку відстеження (бо я часто експортую копію цього repo через sneakernet до іншої системи, яка має доступ для натискання на цей пульт). Я виявив, що немає можливості примусити додати віддалену гілку до локальної, яка ще не була завантажена (тому місцеві не знали, що гілка існує на пульті, і я отримаю помилку:) the requested upstream branch 'origin/remotebranchname' does not exist.

Врешті-решт мені вдалося додати нову, раніше невідому віддалену гілку (без вилучення), додавши новий головний файл у, .git/refs/remotes/origin/remotebranchnameа потім скопіювавши перегляд (очне яблуко було найшвидшим, кульгавим, як це було ;-) із системи з доступом до джерела репо на робочу станцію (з локальним репо, де я додавав віддалену гілку).

Як тільки це було зроблено, я міг потім скористатися git branch --set-upstream-to=origin/remotebranchname


3

або просто:

перейдіть до гілки, якщо ви вже не в ній:

[za]$ git checkout branch_name

бігати

[za]$ git branch --set-upstream origin branch_name
Branch origin set up to track local branch brnach_name by rebasing.

і ви готові:

 [za]$ git push origin branch_name

Ви можете alawys подивитися на конфігураційний файл, щоб побачити, що відстежувати, що запускається:

 [za]$ git config -e

Це також приємно знати, воно показує, які гілки відстежуються, а які - ні. :

  [za]$ git remote show origin 

0

Для тих, хто, як і я, просто хоче синхронізувати назву вашої локальної гілки з назвою віддаленої гілки, ось зручна команда:

git branch -u origin/$(git rev-parse --abbrev-ref HEAD)

0

Щоб не згадувати, що потрібно робити щоразу, коли ви отримуєте повідомлення:

Вкажіть, будь ласка, з якою галуззю ви хочете об'єднатись.
Деталі див. У git-pull (1) .
.....

Ви можете використовувати наступний скрипт, який встановлює походження як висхідне для поточної гілки, в якій ви перебуваєте.

У моєму випадку я майже ніколи не встановлюю щось інше, ніж походження за замовчуванням вгору за течією . Також я майже завжди зберігаю однакову назву гілки для місцевої та віддаленої гілки. Отже, мені підходить наступне:

#!/bin/bash
# scriptname: git-branch-set-originupstream
current_branch="$(git branch | grep -oP '(?<=^\* )(.*)$')"
upstream="origin/$current_branch"
git branch -u "$upstream"

-1

Це теж би спрацювало

git branch --set-upstream-to=/< remote>/< branch> < localbranch>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.