2013-11-15 4 views
1

У меня был репозиторий git с удаленным филиалом/мастером.Почему ветка отслеживания создает новую удаленную ветвь?

Мне нужен репозиторий для отслеживания ветки на другом удаленном git-сервере m1/master. Поэтому я добавил новый удаленный сервер, используя команду git remote add.

Так что я выполнил следующую команду:

$ git branch -a 
* master 
    remotes/m1/master 
    remotes/origin/master 

Так проверить мастер m1 филиал

$ git checkout -b m1-master m1/master 
Branch mht-m1 set up to track remote branch master from m1. 
Switched to a new branch 'm1-master' 

Теперь делает git push

$ git push 
Total 0 (delta 0), reused 0 (delta 0) 
To [email protected]<m1 server>/repo.git 
* [new branch]  m1-master -> m1-master 

Почему git push на ветке слежения m1-master создать новый удаленной ветви, вместо того, чтобы вносить изменения в существующую удаленную ветвь, которую она отслеживает? Что мне здесь не хватает?

PS: Использование мерзавец версии 1.8.4.2

ответ

2

ОК, во-первых, некоторые термины:

  • А (регулярный, обычный, локальный) филиал нечто вроде master.

  • А «удаленный филиал» как origin/master является то, что хранится в вашем местном хранилище, чтобы вспомнить, где, на пульте дистанционного управления, пульт дистанционного управления имеет свой собственный (локальный) филиал наведение.

    «Удаленная ветка» обновляется при контакте с пультом дистанционного управления (обычно при извлечении и нажатии). В то время ваш локальный git узнает, какие у них есть ветви, и обновляет их.

  • «Отслеживание» - это локальная ветка, которая записывает два элемента: «удаленный», обычно это имя, как origin, и другое «имя слияния». Например, если ваше местное отделение master является ветвью отслеживания, оно может быть сконфигурировано с branch.master.remote = origin и branch.master.merge = master. Досадно, вы можете не всегда просто строка их вместе (вы должны карту через remote.origin.fetch быть совершенно правильно с этим), но в целом это означает, что ваш местный master будет «отслеживать» origin/master».

Вы можете 't создайте локальную удаленную ветку. У вас есть fetch или push на/из пульта. Если этот пульт имеет локальную ветвь с именем X, ваш git затем записывает идею пульта этой ветки, используя стиль origin/X

Итак, что здесь происходит? Ну, вы сделали это:

$ git checkout -b m1-master m1/master 

Это создает локальную ветку с именем m1-master. (. Это местное отделение также отслеживание отрасль, но это лишь отчасти Уместно, из-за push.default настройки ниже)

Тогда вы сделали это:

$ git push 

(без какого-либо удаленного имени и не refspecs после push).Git использует пульт дистанционного управления по умолчанию, который, как оказалось, является m1 из-за отслеживания. Далее, хотя git использует refspec по умолчанию, на основе push.default и/или других git config элементов.

Начиная с git 1.8.4.2 "по умолчанию push.default" - matching. Это не создало бы новую ветку (но также ничего не будет нажимать, если там нет m1-master). У вас установлено значение current, что означает: «пожалуйста, обновите или создайте на пульте, текущую ветку, используя ее текущее имя». Текущая ветка - m1-master, так что она была создана.

Изменить push.default для upstream, чтобы исправить это:

git config push.default upstream 

(. Кроме того, см "Warning: push.default is unset; its implicit value is changing in Git 2.0" для различных других вариантов)


Ну, вы можете сделать это с git update-ref или ручной в вашем .git каталоге. :-) Просто, не с «нормальными» пользовательскими командами.

+0

Я не знаю, почему вы сказали:« Это локальное отделение также является ветвью отслеживания, но это не имеет значения здесь ». Это актуально и именно поэтому я использовал команду. Эта ветка отслеживает 'm1/master'. Это то, что я хочу. Что смущает меня, это создало ветвь на удаленном удаленном сервере 'm1', но она не нажала на отслеживаемую ветку, вместо этого она создала новую ветвь на' m1' с тем же именем, что и локальная ветвь. 'm1-master' не был создан в' origin', а в 'm1' – Nithin

+0

Не имеет значения, когда' push.default' установлен в 'current'! (I.e., push не будет смотреть на то, что он отслеживает.) – torek

+0

Хорошо ... Вы хотели сказать, что это не имеет значения для 'push' с текущей настройкой. Было важно тянуть, что я хотел сказать. – Nithin

2

Благодаря опции конфигурации push.default Git слушается. Для того, чтобы привести git-config(1) manual page:

push.default

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

  • ничего - ничего не нажимайте.

  • Соответствие - нажимайте все ветви с одинаковым именем на обоих концах. Это для тех , которые готовят все ветви в печатную форму, а затем выталкивают их с помощью одной команды . Не подходит для перехода в репозиторий, который разделяют несколько пользователей , поскольку локально заблокированные ветви будут пытаться непереходным нажатием вперед, если другие пользователи обновили ветку.

    В настоящее время это значение по умолчанию, но Git 2.0 изменит значение по умолчанию на простое.

  • вверх по течению - нажмите текущую ветвь на ее ветвь вверх по течению. При этом git push обновит тот же самый пульт ДУ, что и тот, который объединен с помощью git pull, делая push и pull симметричным. Смотрите «филиал < имя > .merge.» Для того, как настроить вверх по течению

  • простой - как вверх по течению, но отказывается нажать, если название вверх по течению филиала отличается от местного.

    Это самый безопасный вариант и хорошо подходит для новичков. Он станет дефолтом в Git 2.0.

  • current - нажмите текущую ветвь на одноименную ветку.

простых, текущие и вверх по течению режимов для тех, кто хочет, чтобы вытолкнуть один филиала после окончания работы, даже тогда, когда другие отрасли еще не готовы быть нажатым вне. Если вы работаете с другими людьми, чтобы входить в один и тот же общий репозиторий, вы должны использовать один из них: .

Так что я бы сказал, что по какой-то причине у вас есть push.default набор для current или upstream и так просто работает git push посылает по умолчанию удаленный вами в данный момент проверил отделение пытается обновить там реф с тем же именем (возможно создание Это).

Вы можете проверить, правда ли это, запустив

git config --get-all push.default 

в вашем хранилище.

+0

Установка для 'upstream' должна указывать на имя отслеживания, т. Е.' Master'. Я думаю, что только 'current' должен вести себя так ... – torek

+0

команда' git config --get-all push.default' дает мне 'current'. Итак, что мне теперь делать? – Nithin

+0

Как изменить настройку? – Nithin

Смежные вопросы