TL; версия DR: ветвь удаленного отслеживания origin/master
раньше существовала, но не существует, поэтому локальная ветвь source
отслеживает то, чего не существует, что в лучшем случае подозрительно - это означает, что другая функция Git не может ничего сделать для вас - и Git предупреждает вас об этом. Вы прекрасно ладили, не имея функции «отслеживания вверх по течению», как задумано, так что решать, стоит ли что-то менять.
Для другого взгляда на настройки upstream см. Почему мне нужно «git push --set-upstream origin <branch>»?
Это предупреждение - новая вещь в Git, появившаяся сначала в Git 1.8.5. Примечания к выпуску содержат только один короткий пункт об этом:
- «git branch -v -v» (и «git status») не делали различий между ветвью, которая не основана ни на какой другой ветке, ветвью, которая синхронизирована с ее восходящей веткой, и веткой, которая настроена с восходящей веткой ветвь, которая больше не существует.
Чтобы описать, что это значит, вам сначала нужно знать о «удаленных», «ветках удаленного отслеживания» и о том, как Git обрабатывает «отслеживание восходящего потока». ( Ветви удаленного отслеживания - ужасно некорректный термин - вместо этого я начал использовать имена удаленного отслеживания , что, я думаю, является небольшим улучшением. Ниже, однако, я буду использовать «ветку удаленного отслеживания» для согласованности с документацией Git. )
Каждый «удаленный» - это просто имя, как origin
или octopress
в этом случае. Их целью является запись таких вещей, как полный URL-адрес тех мест, из которых вы git fetch
или git pull
обновляетесь. Когда вы используете 1 Git, он переходит на этот пульт (используя сохраненный URL) и переносит соответствующий набор обновлений. Он также записывает обновления, используя «удаленное отслеживание веток».git fetch remote,
«Ветвь удаленного отслеживания» (или имя удаленного отслеживания) - это просто запись имени ветви, которое последний раз видели на каком-то «удаленном». Каждый пульт является Git-репозиторием, поэтому у него есть ветки. Ветви на удаленном «источнике» записываются в вашем локальном хранилище под remotes/origin/
. Текст , который вы показали , говорит , что есть филиал имени source
на origin
, и ветви по имени 2.1
, linklog
и так далее на octopress
.
(Конечно, «нормальная» или «локальная» ветвь - это просто имя ветки, которое вы создали в своем собственном хранилище.)
Наконец, вы можете настроить (локальную) ветку, чтобы «отслеживать» «ветку удаленного отслеживания». Как только локальная ветвь L
настроена на отслеживание ветки удаленного отслеживания R
, Git будет вызывать R
ее «восходящий поток» и сообщать вам, «находитесь ли вы впереди» и / или «позади» восходящего потока (с точки зрения принятия). Обычно (даже рекомендуется) для локальных филиалов и филиалов с удаленным отслеживанием использовать одно и то же имя (за исключением части с префиксом удаленного доступа), например source
и origin/source
, но это на самом деле не обязательно.
И в этом случае этого не происходит. У вас есть местное отделение, которое source
отслеживает удаленное отслеживание origin/master
.
Вам не нужно знать точную механику того, как Git устанавливает локальную ветку для отслеживания удаленной, но они актуальны ниже, поэтому я покажу, как это работает. Начнем с названия вашей местной ветки source
. Есть две записи конфигурации, использующие это имя, пишется branch.source.remote
и branch.source.merge
. Из вывода, который вы показали, ясно, что они оба установлены, так что вы увидите следующее, если выполните указанные команды:
$ git config --get branch.source.remote
origin
$ git config --get branch.source.merge
refs/heads/master
Собираем их вместе, 2 это говорит о том, что Git ваша ветка source
отслеживает «удаленного отслеживания ветви», origin/master
.
Но теперь посмотрим на вывод git branch -a
, который показывает все локальные и удаленные имена веток в вашем хранилище. Имена удаленного отслеживания перечислены под remotes/
... и нетremotes/origin/master
. Предположительно, было когда-то, но теперь это ушло.
Git сообщает вам, что вы можете удалить информацию об отслеживании --unset-upstream
. Это очистит branch.source.origin
и branch.source.merge
, и, и остановит предупреждение.
Вполне вероятно, что вам нужно переключиться с отслеживания origin/master
на отслеживание чего-то другого: возможно origin/source
, но, возможно, одного из octopress/
названий.
Вы можете сделать это с git branch --set-upstream-to
, 3 , например:
$ git branch --set-upstream-to=origin/source
(Предполагая, что вы все еще находитесь в "источнике" ветки, и это origin/source
тот восходящий поток, который вы хотите - у меня нет никакого способа сказать, какой из них, если он есть, вы действительно хотите, хотя)
(Смотрите также Как сделать, чтобы существующая ветка Git отслеживала удаленную ветку? )
Я думаю, что вы получили здесь то, что, когда вы впервые сделали git clone
, у клонированной вещи была ветвь master
. У вас также была ветка master
, которая была настроена на отслеживание origin/master
(это нормальная стандартная настройка для git). Это означало, что у вас было branch.master.remote
и branch.master.merge
установлено, чтобы origin
и refs/heads/master
. Но затем ваш origin
пульт изменил свое имя с master
на source
. Чтобы соответствовать, я думаю, вы также изменили свое местное имя с master
на source
. Это изменило имена ваших настроек, с branch.master.remote
на branch.source.remote
и с branch.master.merge
на branch.source.merge
... но оставило старые значения , так что branch.source.merge
теперь было неправильно.
Именно в этот момент связь «вверх по течению» прервалась, но в версиях Git старше 1.8.5 Git никогда не замечал нарушенных настроек. Теперь, когда у вас есть 1.8.5, это указывает на это.
Это охватывает большинство вопросов, но не вопрос «нужно ли мне это исправить». Вполне вероятно, что вы уже много лет работаете над разрушением, например ( ). Если вы продолжите это делать, это продолжит работать над проблемой - так что нет, вам не нужно ее исправлять. Если хотите, вы можете использовать для удаления восходящего потока и прекращения жалоб, и не иметь пометки в местном отделении как имеющего какой-либо восходящий поток.git pull remote branch
git pull origin source
--unset-upstream
source
Смысл восходящего потока - сделать различные операции более удобными. Например, git fetch
следует, git merge
что обычно «делает правильные вещи», если восходящий поток настроен правильно, а git status
после git fetch
сообщит вам, соответствует ли ваш репо восходящему, для этой ветви.
Если вы хотите удобство, переустановите апстрим.
1git pull
использует git fetch
, а с Git 1.8.4 это (наконец-то!) Также обновляет информацию об «ветке удаленного отслеживания». В более старых версиях Git обновления не записывались в ветки удаленного отслеживания с помощью git pull
только git fetch
. Поскольку ваш Git должен быть как минимум версии 1.8.5, это не проблема для вас.
2 Ну, это плюс строка конфигурации, которую я намеренно игнорирую remote.origin.fetch
. Git должен сопоставить имя «слияния», чтобы выяснить, что полное локальное имя для удаленной ветки есть refs/remotes/origin/master
. Отображение почти всегда работает так же, как это, так что это предсказуемо, что master
идет origin/master
.
3 Или с git config
. Если вы просто хотите установить апстрим к origin/source
единственной части, которая должна быть изменена branch.source.merge
, и git config branch.source.merge refs/heads/source
сделает это. Но --set-upstream-to
говорит, что вы хотите сделать, а не заставлять вас делать это вручную, так что это «лучший способ».