# git remote _Удалённые репозитории · GitLab Knowledge Base_ **TL;DR:** Управляет списком URL-ов, с которыми связан репозиторий. По умолчанию после `clone` один remote по имени `origin`. Можно добавить второй (`upstream` для fork-flow), удалить, переименовать. Remote - это просто имя для URL. Внутри `.git/config` под каждый remote лежит секция: ``` [remote "origin"] url = git@github.com:foo/bar.git fetch = +refs/heads/*:refs/remotes/origin/* ``` Команда `git remote` смотрит и редактирует этот список. ## Основные команды ```bash git remote # список имён git remote -v # с URL'ами и направлениями git remote show origin # детальная инфа: ветки, tracking git remote add upstream # добавить git remote rename origin foo # переименовать git remote remove upstream # удалить git remote set-url origin # сменить URL без re-clone ``` Типичный вывод `git remote -v`: ``` origin git@github.com:me/bar.git (fetch) origin git@github.com:me/bar.git (push) upstream git@github.com:original/bar.git (fetch) upstream git@github.com:original/bar.git (push) ``` Два направления - fetch и push - могут указывать на разные URL'ы (редкий случай: тянуть из одного, пушить в другой). Обычно совпадают. ## Почему «origin» Просто имя. Git клонирует с `origin` по дефолту, потому что так принято. Хочешь - переименовывай: ```bash git remote rename origin upstream ``` В fork-сценарии (см. [fork-vs-clone](/courses/git/kb/fork-vs-clone.md)) часто: - `origin` - твой fork (`me/repo`), - `upstream` - оригинальный репо (`original/repo`). Подробнее в [upstream-vs-origin](/courses/git/kb/upstream-vs-origin.md). ## Сменить URL без re-clone Сценарий: репозиторий переехал с GitHub на GitLab. Не нужно клонировать заново: ```bash git remote set-url origin git@gitlab.com:foo/bar.git git fetch ``` Всё работает дальше, история на месте. ## Push URL и Fetch URL раздельно Иногда нужно тянуть из публичного зеркала, а пушить в приватный: ```bash git remote set-url origin https://github.com/foo/bar.git git remote set-url --push origin git@gitlab.com:foo/bar.git ``` Теперь `git fetch` пойдёт на GitHub, `git push` - на GitLab. Это редкий случай, но иногда полезно при миграциях. ## Подводные камни - `git remote add` НЕ делает fetch автоматически. После добавления нужно `git fetch `, иначе ветки нового remote не появятся. - URL хранится в `.git/config` без шифрования. Если URL содержит пароль (`https://user:password@...`) - он лежит plaintext. Лучше через SSH или credential helper. - Имена remote локальные. У тебя `upstream` может указывать на одно, у коллеги на другое. Это нормально, но при общении говорите URL. ## Команды ```bash git remote -v ``` Список всех remote с URL ```bash git remote add upstream ``` Добавить второй remote - обычно оригинал при fork-flow ```bash git remote set-url origin ``` Сменить URL без переклонирования ```bash git remote show origin ``` Подробная инфа: какие ветки tracking, какие нет ## См. также - [git clone](/courses/git/kb/clone.md) - [git fetch](/courses/git/kb/fetch.md) - [upstream vs origin](/courses/git/kb/upstream-vs-origin.md) - [Fork vs clone](/courses/git/kb/fork-vs-clone.md)