Git-репозиторий: как создать через git init и подключить remote
Git репозиторий — это папка проекта вместе со скрытым каталогом .git, где Git хранит всю историю изменений, ветки и настройки. Создаётся он командой git init в папке проекта или скачивается готовым через git clone. Удалённый репозиторий подключается командой git remote add origin адрес.
Git репозиторий — это проект, за изменениями которого следит Git. Физически это обычная папка с вашими файлами плюс скрытый каталог .git, в котором хранится вся история: коммиты, ветки, теги, настройки. Удалите .git — и останутся просто файлы без единой версии в прошлом.
Из чего состоит репозиторий
Работая с Git, полезно держать в голове три области, между которыми путешествуют изменения:
- рабочая директория (working tree) — файлы, которые вы видите и редактируете;
- индекс (staging area) — черновик следующего коммита, куда изменения попадают через
git add; - история — база коммитов внутри
.git, куда изменения попадают черезgit commit.
Строго говоря, сам репозиторий — это содержимое .git. Рабочая директория — лишь одна «развёрнутая» версия проекта, которую Git достаёт из истории.
Как создать git репозиторий командой git init
Перейдите в папку проекта и выполните одну команду:
cd ~/projects/my-app
git init
Initialized empty Git repository in /home/user/projects/my-app/.git/
Репозиторий можно создать и в пустой папке, и в папке, где уже лежат файлы. В последнем случае ничего не потеряется: существующие файлы просто станут неотслеживаемыми (untracked), пока вы не добавите их через git add.
Полезные варианты команды:
# Создать папку и репозиторий в ней сразу
git init my-app
# Задать имя первой ветки (иначе — master или значение из настроек)
git init -b main
# Сделать main веткой по умолчанию для всех новых репозиториев
git config --global init.defaultBranch main
Первый коммит
Пустой репозиторий без коммитов почти бесполезен. Сразу после git init обычно делают так:
git config --global user.name "Иван Петров"
git config --global user.email "ivan@example.com"
git status
git add .
git commit -m "Начальная структура проекта"
Имя и e-mail нужно задать один раз на компьютере — они записываются в каждый коммит. Без них Git откажется коммитить и попросит представиться.
Сразу добавьте .gitignore
До первого git add . создайте файл .gitignore со списком того, что не должно попасть в репозиторий: зависимости, сборки, секреты, файлы IDE.
node_modules/
dist/
.env
.idea/
.vscode/
*.log
__pycache__/
Если файл уже попал в коммит, .gitignore его не уберёт. Нужно перестать отслеживать файл, оставив его на диске: git rm --cached .env, а затем закоммитить.
Что внутри папки .git
Заглядывать туда в обычной работе не нужно, но понимание структуры снимает много вопросов:
| Элемент | Что хранит |
|---|---|
objects/ | Сжатые объекты: содержимое файлов (blob), структуры папок (tree), коммиты |
refs/heads/ | Ветки — файлы с хешем последнего коммита |
refs/tags/ | Теги |
HEAD | Указатель на текущую ветку, например ref: refs/heads/main |
config | Настройки этого репозитория, в том числе список remote |
index | Состояние staging area |
hooks/ | Скрипты, запускаемые на события (pre-commit, pre-push) |
Отсюда важный вывод: ветка в Git — это крошечный файл с одним хешем. Поэтому создание веток мгновенное и бесплатное.
Как проверить, что папка — это репозиторий
git status
# или точнее
git rev-parse --is-inside-work-tree
Вне репозитория вы получите fatal: not a git repository (or any of the parent directories): .git. Обратите внимание на «parent directories»: Git ищет .git вверх по дереву папок. Если случайно выполнить git init в домашней директории, вся она станет репозиторием — такую папку .git нужно удалить.
Локальный и удалённый репозиторий
Репозиторий, созданный через git init, существует только на вашем компьютере. Чтобы делиться кодом и иметь резервную копию, к нему подключают удалённый репозиторий (remote) — копию на сервере: GitHub, GitLab, Bitbucket или собственном git сервере.
Удалённый репозиторий не «главный» с точки зрения Git: каждая копия полноценна и содержит всю историю. Центральным его делает только договорённость команды.
git remote: подключение удалённого репозитория
Remote — это короткое имя для адреса сервера. Основное имя по соглашению — origin.
# Добавить remote
git remote add origin git@github.com:username/my-app.git
# Посмотреть список с адресами
git remote -v
origin git@github.com:username/my-app.git (fetch)
origin git@github.com:username/my-app.git (push)
Затем отправьте ветку и свяжите её с удалённой:
git push -u origin main
Основные команды git remote
| Команда | Что делает |
|---|---|
git remote -v | Список remote с адресами |
git remote add <имя> <url> | Подключить новый удалённый репозиторий |
git remote set-url origin <url> | Сменить адрес, например HTTPS на SSH |
git remote rename origin old | Переименовать remote |
git remote remove old | Удалить remote (сам сервер не трогается) |
git remote show origin | Подробности: ветки, отслеживание, что отстаёт |
Форматы адресов
https://github.com/user/repo.git— HTTPS, работает везде, для записи нужен токен;git@github.com:user/repo.git— SSH, нужен ключ, после настройки пароли не спрашиваются;/srv/git/repo.gitилиfile:///srv/git/repo.git— локальный путь, удобно для экспериментов.
Типичные ошибки
«error: remote origin already exists». Remote с таким именем уже есть. Если нужно поменять адрес — используйте git remote set-url origin <url>, а не повторный add.
«failed to push some refs» / «Updates were rejected». На сервере есть коммиты, которых нет у вас, — часто это README, созданный при заведении репозитория на сайте. Выполните git pull --rebase origin main и повторите push. Если истории совсем не связаны, Git ответит «refusing to merge unrelated histories» — тогда для git pull нужен флаг --allow-unrelated-histories. Проще создавать репозиторий на сайте пустым.
«src refspec main does not match any». Вы пытаетесь отправить ветку, которой нет: либо ещё не было ни одного коммита, либо ветка называется master. Проверьте git branch.
Свой git сервер: bare-репозиторий
GitHub не обязателен. Удалённым репозиторием может быть любая машина, куда у вас есть SSH-доступ. Для этого на сервере создают «голый» (bare) репозиторий — без рабочей директории, только содержимое .git:
# На сервере
ssh user@server
git init --bare /srv/git/my-app.git
# На своём компьютере
git remote add origin user@server:/srv/git/my-app.git
git push -u origin main
Чтобы работать с таким сервером втроём, достаточно дать коллегам SSH-доступ к папке репозитория и общую группу с правами на запись. Для разграничения прав по веткам и проектам этого уже мало — тогда нужен полноценный git хостинг.
В bare-репозиторий нельзя «зайти и поправить файл» — он предназначен только для обмена через push и fetch. Именно так устроены репозитории на любом git хостинге. Если нужен веб-интерфейс, ревью и задачи, ставят self-hosted решения вроде GitLab, Gitea или Forgejo.
Отслеживающие ветки: как локальный репозиторий видит сервер
После подключения remote и первого git fetch или git push в репозитории появляются удалённые ветки вида origin/main. Это не ветки на сервере, а локальные «снимки» того, что вы видели на сервере в момент последней синхронизации. Они обновляются только при fetch, pull и push.
Отсюда важное различие трёх команд обмена:
| Команда | Что меняет |
|---|---|
git fetch | Обновляет origin/*, ваши ветки и файлы не трогает |
git pull | fetch + слияние origin/main в текущую ветку |
git push | Отправляет ваши коммиты и обновляет ветку на сервере |
Узнать, насколько ваша ветка отстала или ушла вперёд, можно так:
git fetch
git status -sb
## main...origin/main [ahead 2, behind 1]
Здесь у вас два коммита, которых нет на сервере, и один серверный, которого нет у вас. Перед push нужно сначала забрать этот коммит.
Связь локальной ветки с удалённой (upstream) задаётся флагом -u при первом push. Если забыли, её можно установить отдельно: git branch --set-upstream-to=origin/main. Посмотреть все связи — git branch -vv.
Несколько репозиториев: монорепо или по одному на проект
Частый вопрос новичков — сколько git репозиториев заводить. Простое правило: один репозиторий на одну независимо развиваемую и выпускаемую единицу. Учебные проекты, пет-проекты и отдельные сервисы — разные репозитории. Не создавайте один репозиторий на всю папку «Мои проекты»: история перемешается, а выложить один проект в портфолио отдельно станет сложно.
Крупные компании иногда держат весь код в одном монорепозитории ради общих изменений и единой сборки, но это осознанное архитектурное решение со своими инструментами. Новичку стоит начинать с правила «один проект — один репозиторий» и никогда не вкладывать один репозиторий внутрь другого без подмодулей.
git init или git clone
| Ситуация | Команда |
|---|---|
| Начинаете новый проект с нуля | git init |
| Есть папка с кодом без контроля версий | git init в этой папке |
| Проект уже лежит на GitHub или сервере | git clone <url> |
| Нужен центральный репозиторий на своём сервере | git init --bare |
После git clone remote origin уже настроен, вручную добавлять его не нужно.
Пошаговый сценарий: от папки до репозитория на GitHub
- Создайте папку проекта и выполните
git init -b main. - Добавьте
.gitignoreи README. - Сделайте первый коммит:
git add .иgit commit -m "Initial commit". - Создайте на GitHub пустой репозиторий — без README, лицензии и .gitignore.
- Подключите его:
git remote add origin <адрес>. - Отправьте код:
git push -u origin main. - Дальше работайте циклом: правки →
git add→git commit→git push.
Итог
Git репозиторий — это ваш проект плюс папка .git с полной историей. Создаётся он командой git init, а связь с сервером настраивается через git remote add origin и первый git push -u. Удалённым репозиторием может быть GitHub, GitLab или ваш собственный git сервер с bare-репозиторием. Создание первого репозитория, индекс и подключение remote разобраны на практике в курсе по Git.
Частые вопросы
Как удалить git репозиторий, но оставить файлы?
Удалите скрытую папку .git в корне проекта: rm -rf .git в Linux и macOS. Файлы останутся, но вся история версий будет потеряна.
Можно ли выполнить git init в папке, где уже есть репозиторий?
Да, это безопасно: Git сообщит Reinitialized existing Git repository и не тронет историю. Команда лишь досоздаст недостающие служебные файлы.
Сколько remote можно подключить к одному репозиторию?
Сколько угодно. Например, origin для своего форка и upstream для оригинального проекта — так обычно работают с open source.
Где хранятся настройки конкретного репозитория?
В файле .git/config. Глобальные настройки пользователя лежат в ~/.gitconfig, их задают через git config --global.
Чем bare-репозиторий отличается от обычного?
У bare-репозитория нет рабочей директории с файлами, только служебные данные Git. Его используют как центральный репозиторий на сервере, куда делают push.
Эта тема подробно разобрана с практикой в курсе «Git с нуля до уверенного разработчика».
- Первый репозиторий: init, add, commit и магия индекса
- GitHub и удалённые репозитории: ваш код в облаке