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 branchgit pull origin source--unset-upstreamsource
Смысл восходящего потока - сделать различные операции более удобными. Например, 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говорит, что вы хотите сделать, а не заставлять вас делать это вручную, так что это «лучший способ».