2013-12-08 3 views
2

Предположим, что удаленное репо remote имеет ветку spanking_new_branch, которая не представлена ​​/ не указана каким-либо образом в локальном репозитории. Я хочу создать локальную ветку, которая отслеживает remote/spanking_new_branch.Можно ли создать ветку отслеживания с веткой git, а не git-checkout?

Когда я ищу в Интернете способы для этого, я нахожу только те, которые основаны на git checkout. Есть ли способ сделать это, используя только git branch, не используя git checkout?

(мотивация на этот вопрос только понять git лучше.)

+0

Вы хотите, чтобы исключить все, что за пределами sparkling_new отрасли? В противном случае 'fetch' будет делать, imho. – xtofl

ответ

2
git branch --set-upstream-to=remote/spanking_new_branch local_branchname 

где local_branchname должны уже существовать. Он может быть создан с использованием git branch local_branchname <start-point> (<start-point> is commit-ish и может быть опущен для использования текущей фиксации в качестве начальной точки).

Предполагается, что локальный репозиторий знает о удаленной ветви, например. по телефону git fetch.

+1

'-u ' или '--set-upstream-to = ' являются последними вариациями этого, введенными в git 1.8. – torek

+0

@torek Спасибо за подсказку! Я отредактировал свой ответ, потому что то, что я там написал, не сработает. Это было сочетание старой и новой версии. –

0

Кроме Jonas Wielicki's answer, вы можете сделать это с помощью git config.

Местный филиал B следы какой-то другой ветви, когда:

  • branch.B.remote установлен, и
  • branch.B.merge установлен.

Отслеживаемая ветка зависит от обоих значений. Обычно первым устанавливается на имя удаленного, обычно origin, и чаще всего не имя merge совпадает с именем локального, так что локальная ветвь master дорожки origin/master (например), потому что branch.master.remote = origin и branch.master.merge = master.

Однако «удаленное» имя может быть ., и в этом случае ветвь фактически отслеживает другую локальную ветку! (Это полезно только в том случае, если другое имя филиала отличается - если ветвь «отслеживает себя», то каждое обновление в ветку также обновляет ветвь вверх по течению, так что ветка всегда актуальна, что довольно глупо. :-))

В качестве последней причуды в документации говорится, что отслеживание массируется по линиям fetch, связанным с пультом дистанционного управления. Я не пробовал это сам, но это означает, что, например:

git config remote.zork.url = ssh://... 
git config remote.zork.fetch = '+refs/heads/master:refs/xyzzy/plugh' 
git fetch zork 
git config branch.master.remote zork 
git config branch.master.merge plugh 

может вызвать местное отделение master отслеживать zork «s master несмотря на то, что не будет никаких„удаленных филиалов“для дистанционного zork, поскольку„удаленных филиалов“ живут в домене refs/remotes/, а refs/xyzzy/plugh отличается (и даже не содержит названия master)!

(Я не знаю, почему это так сложно.)

0

Я думаю, что вы хотите:

git branch --track LOCAL_BRANCH_NAME REMOTE/REMOTE_BRANCH_NAME 

Например:

git branch --track spanking_new_branch origin/spanking_new_branch 

Часто, если вы используете то же имя удаленного филиала, вы можете использовать:

git branch --track spanking_new_branch 

И он будет автоматически настроен для отслеживания удаленной версии.

0

Да Формат:

git branch --set-upstream ${local_branch} ${remote}/${remote_branch} 

Пример использования (предполагает topic1 и происхождение/topic1 уже существуют):

git branch --set-upstream topic1 origin/topic1 
Смежные вопросы