Инструкция

Git-репозиторий: как создать через git init и подключить remote

Обновлено: · Skillaria.Top

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 pullfetch + слияние 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

  1. Создайте папку проекта и выполните git init -b main.
  2. Добавьте .gitignore и README.
  3. Сделайте первый коммит: git add . и git commit -m "Initial commit".
  4. Создайте на GitHub пустой репозиторий — без README, лицензии и .gitignore.
  5. Подключите его: git remote add origin <адрес>.
  6. Отправьте код: git push -u origin main.
  7. Дальше работайте циклом: правки → 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 с нуля до уверенного разработчика».

Перейти к курсу