Зробити існуючу гітку 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.