git init: как инициализировать Git репозиторий
Команда git init — первый шаг при создании нового проекта с Git. Она превращает обычную папку в Git-репозиторий: создаёт скрытую папку .git со всей необходимой инфраструктурой для отслеживания файлов. Эта статья объяснит что делает git init, покажет разные варианты использования и расскажет про git init --bare для серверных репозиториев.
Что делает git init #
Одна команда — несколько действий:
git init
Git создаёт скрытую папку .git в текущей директории и наполняет её начальной структурой. С этого момента папка является Git-репозиторием и Git начинает отслеживать изменения в ней.
$ cd my-project
$ git init
Initialized empty Git repository in /Users/you/my-project/.git/
$ git status
On branch main
No commits yet
nothing to commit (create/copy files and use "git add" to track)
После инициализации у тебя есть пустой репозиторий. Коммитов ещё нет, файлы не отслеживаются — нужно их добавить через git add.
Структура папки .git #
После git init папка .git содержит:
.git/
├── objects/ # База данных объектов (блобы, деревья, коммиты)
│ ├── info/
│ └── pack/
├── refs/ # Указатели на коммиты
│ ├── heads/ # Локальные ветки
│ └── tags/ # Теги
├── HEAD # Указатель на текущую ветку
├── config # Конфигурация репозитория
├── description # Описание (используется GitWeb)
├── hooks/ # Скрипты для автоматизации
│ ├── pre-commit.sample
│ └── ...
└── info/
└── exclude # Локальный gitignore (не коммитится)
Самое важное: objects/ — здесь хранится вся история. HEAD — указывает на текущую ветку. config — настройки конкретного репозитория.
⚠️ Осторожно: не редактируй файлы внутри
.gitвручную. Это может повредить репозиторий.
Простая инициализация #
Самый распространённый сценарий — инициализировать репозиторий в существующей папке проекта:
# Перейти в папку проекта
cd my-project
# Инициализировать репозиторий
git init
# Проверить что создалось
ls -la
# итого 0
# drwxr-xr-x .git/
# -rw-r--r-- main.py
# -rw-r--r-- README.md
Создание папки и инициализация в одну команду #
Если папки ещё нет — можно передать имя папки как аргумент:
# Создать папку my-project и инициализировать в ней репозиторий
git init my-project
# Это эквивалентно:
mkdir my-project && cd my-project && git init
Git создаст папку, войдёт в неё и инициализирует репозиторий.
Указание имени начальной ветки #
По умолчанию главная ветка называется master. Современный стандарт — называть её main. Указать имя можно флагом -b:
# Инициализировать с главной веткой 'main'
git init -b main
# Или задать глобально для всех новых репозиториев
git config --global init.defaultBranch main
После этого все новые репозитории будут начинаться с ветки main.
git init –bare: репозиторий для сервера #
git init --bare создаёт «голый» (bare) репозиторий — без рабочей директории. Он содержит только данные Git (то, что обычно лежит в папке .git), без файлов проекта.
Голый репозиторий используется как централизованное хранилище, куда разработчики отправляют (push) и откуда забирают (pull) изменения:
# Создать голый репозиторий на сервере
git init --bare /opt/git/project.git
# Теперь разработчики могут клонировать его
git clone user@server:/opt/git/project.git
По соглашению голые репозитории именуются с суффиксом .git: project.git.
Ключевые отличия:
git init | git init --bare | |
|---|---|---|
| Рабочая директория | Есть | Нет |
| Где используется | Локально на компьютере разработчика | На сервере как центральное хранилище |
| Можно ли коммитить напрямую | Да | Нет |
| Содержит | Папку .git + рабочие файлы | Только содержимое .git |
Подробнее о голых репозиториях и настройке собственного Git-сервера читай в статье Удалённые репозитории и Git-сервер.
Первые шаги после git init #
После инициализации репозиторий пустой — нужно добавить файлы и сделать первый коммит:
# 1. Инициализировать репозиторий
git init -b main
# 2. Создать первый файл
echo "# My Project" > README.md
# 3. Проверить статус
git status
# On branch main
# Untracked files:
# README.md
# 4. Добавить файл в индекс
git add README.md
# 5. Создать первый коммит
git commit -m "Initial commit"
# 6. Посмотреть историю
git log --oneline
# a3f5b2d Initial commit
Если нужно подключить удалённый репозиторий (например, GitHub):
# 7. Добавить удалённый репозиторий
git remote add origin https://github.com/username/project.git
# 8. Отправить на GitHub
git push -u origin main
Переинициализация существующего репозитория #
Если репозиторий уже инициализирован, повторный git init безопасен — он не уничтожит историю:
$ git init
Reinitialized existing Git repository in /Users/you/my-project/.git/
Это может пригодиться для обновления шаблонов hooks или восстановления повреждённой конфигурации.
Инициализация с шаблоном #
Можно использовать директорию-шаблон при инициализации. Git скопирует её содержимое в новый .git:
git init --template=/path/to/template my-project
Полезно в организациях, где все репозитории должны иметь одинаковые hooks или конфигурацию.
Частые ошибки #
«fatal: not a git repository» — ты запускаешь Git-команду в папке, которая не является репозиторием:
$ git status
fatal: not a git repository (or any of the parent directories): .git
# Решение: инициализировать репозиторий
git init
# Или убедиться, что ты в правильной папке
pwd
Случайная инициализация в неправильной папке. Если ты сделал git init не там — просто удали папку .git:
# Отменить инициализацию: удалить папку .git
rm -rf .git
# Файлы проекта останутся нетронутыми
Инициализация в домашней папке. Никогда не делай git init в домашней директории (~). Git начнёт отслеживать все твои файлы:
# ❌ Плохо
cd ~
git init
# ✅ Хорошо
mkdir ~/projects/my-project
cd ~/projects/my-project
git init
Часто задаваемые вопросы #
Что произойдёт если запустить git init дважды? #
Ничего плохого. Git выведет Reinitialized existing Git repository и обновит шаблонные файлы. История и коммиты не затронуты.
Зачем нужна папка .git? #
В ней хранится весь репозиторий: история коммитов, ветки, конфигурация, хуки. Без этой папки Git не знает о твоём проекте.
В чём разница между git init и git clone? #
git init создаёт новый пустой репозиторий. git clone копирует существующий репозиторий с сервера, включая всю историю и настройку удалённого репо. Подробнее в статье Что такое репозиторий.
Как инициализировать с главной веткой main вместо master? #
git init -b main
# или глобально:
git config --global init.defaultBranch main
Можно ли git init –bare переделать в обычный репозиторий? #
Теоретически да, но это нетривиально. Проще склонировать голый репозиторий: git clone my-project.git my-project — и ты получишь обычный репозиторий с рабочей директорией.