Почему `git push` для удаленного не удаленного, а не двойного`git fetch` от удаленного
Во-первых, я понимаю, как связаны с отправкой на не-голые пульты git, включая использование опции git config receive.denyCurrentBranch
и другие обходные пути, поэтому я не ищу ответы, такие как здесь:
- Git push error '[удаленный отклонен] master -> master (ветка в настоящее время извлечена)'
- Нажмите на не обнаженное хранилище Git
- Git подталкивает к не-голому репо, сохраняет текущее рабочее дерево
- Git: безопасное создание репозиториев
Это скорее вопрос реализации / представления / философии git.
Почему не может git push <remote>
для не голого пульта дистанционного управления быть двойным или по существу таким же, как git fetch <source>
с пульта? Таким образом, мой локальный рабочий каталог на удаленном может устареть (отставать) от нового контента, и у меня даже могут быть локальные изменения (фиксируются заранее или даже ставятся / не ставятся / хранятся / что угодно), но этот рабочий каталог полностью нетронутый операцией push? Если бы это было так, то однажды на пульте я мог бы слить или перебазировать или что угодно. Фактически, это именно то, что заявлено в этой записи в git faq для kernel.org.
Мотивация для этого действительно такая же, как и у всех, кто задает вопросы " как": у меня нет никакого способа легко получить доступ к "источнику" push-сообщения с пульта по причинам {firewall, nat, security}.
Возможно, мне не хватает фундаментальных знаний о том, как git действительно отслеживает вещи, которые "если бы я только понял XXXX", я бы знал ответ; просвети меня, пожалуйста.
1 ответ
Проблема в том, что нажатие переписывает ссылки. HEAD
является синонимом последней проверки и переписывания, что ref молча аннулирует рабочее дерево и индекс - фиксация в этом репо потеряет внесенные изменения, без указания того, что это произошло. Отказ от толчка - самое простое решение. Если делать git pull
в пункте назначения не вариант, затем нажмите на одноразовое решение и исправьте ссылки:
git push origin master:fakemaster
cd $origindir
git checkout -B master fakemaster
git branch -D fakemaster