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
говорит, что вы хотите сделать, а не заставлять вас делать это вручную, так что это «лучший способ».
Ответ Торека, вероятно, идеален, но я просто хотел, чтобы в отчете было упомянуто другое дело, отличное от описанного в исходном вопросе, но может появиться та же ошибка (так как это может помочь другим с подобной проблемой):
Я создал пустой (новый) репо
git init --bare
на одном из моих серверов. Затем яgit clone
сделал это в локальной рабочей области на моем ПК.После совершения одной версии в локальном репо я получил эту ошибку после вызова
git status
.После ответа Торека я понимаю, что в результате первого коммита локального репозитория рабочего каталога была создана «главная» ветка. Но в удаленном репо (на сервере) ничего не было, поэтому даже не было ветки "master" (remotes / origin / master).
После запуска
git push origin master
из локального репо, в удаленном репо наконец появилась основная ветка. Это остановило ошибку от появления.Итак, в заключение - такую ошибку можно получить для нового нового удаленного репо с нулевым коммитом, поскольку у него нет ветки, включая «master».
источник
On branch source Your branch is based on 'origin/master', but the upstream is gone. (use "git branch --unset-upstream" to fixup)
и, хотя оно и субъективно, более вероятно, что оно будет вызвано клонированием пустого репозитория, настолько хорошего, что здесь есть альтернативный ответ.Это может решить вашу проблему.
после внесения изменений вы можете зафиксировать его, а затем
надеюсь, что это работает для вас.
Спасибо
источник
Для меня
.git/refs/origin/master
испортился.Я сделал следующее, что исправило проблему для меня.
источник
На самом деле Торек уже говорил вам, как использовать инструменты гораздо лучше, чем я мог бы сделать. Тем не менее, в этом случае я думаю, что важно указать на что-то своеобразное, если вы будете следовать инструкциям на http://octopress.org/docs/deploying/github/ . А именно, у вас будет несколько репозиториев github в вашей настройке. Сначала один со всем исходным кодом для вашего сайта, скажем, в каталоге
$WEBSITE
, а затем тот, в котором находятся только статические сгенерированные файлы$WEBSITE/_deploy
. Самое смешное в настройке - это то, что.gitignore
в$WEBSITE
так что эта настройка действительно работает.Достаточно введения. В этом случае ошибка также может исходить из хранилища в
_deploy
.У
.git/config
вас обычно нужно найти что-то вроде этого:Но в вашем случае у мастера ветки нет пульта.
Что вы можете решить с помощью:
Итак, все так, как сказал вам Торек, но, возможно, важно отметить, что это вполне может касаться
_deploy
каталога, а не корня вашего сайта.PS: Возможно, стоит использовать оболочку, например,
zsh
сgit
плагином, чтобы не быть укушенным этой вещью в будущем. Это сразу покажет, что_deploy
касается другого хранилища.источник
У меня был этот вопрос дважды, и он всегда был вызван повреждением файла кэша git в моей локальной ветке. Я исправил это, записав недостающий хеш коммита в этот файл. Я получил правильный хеш коммита с сервера и локально выполнил следующую команду:
источник
Проблема: ваша ветка основана на 'origin / master', но восходящий поток исчез.
Решение: git branch --unset-upstream
источник
удалите свою локальную ветку с помощью следующей команды
Вы могли бы также сделать
который в основном вызывает удаление (даже если локальный не объединен с источником)
источник