Олег Марков
Инициализация репозитория с помощью git init - полный разбор команды
Введение
Инициализация репозитория — это первая операция, с которой обычно начинается работа с системой контроля версий Git в новом проекте. В момент, когда вы решаете отслеживать изменения в коде или документации, вам нужно превратить обычную папку на диске в Git‑репозиторий. Именно это и делает команда git init.
Смотрите, я пошагово покажу вам, что именно создает git init, какие есть режимы работы команды, чем отличается обычный репозиторий от bare‑репозитория, какие опции стоит знать и какие ошибки чаще всего возникают у разработчиков при первой настройке.
Что делает git init на самом деле
Внутренняя структура репозитория
Когда вы выполняете в папке проекта команду:
git init
Git создает в текущем каталоге скрытую папку .git. Эта директория и есть "сердце" репозитория. Все ваши коммиты, ветки, теги, настройки и служебные данные хранятся именно там.
Посмотрите, как выглядит структура .git после инициализации (вывод может немного отличаться в зависимости от версии Git):
$ git init
Initialized empty Git repository in /path/to/project/.git/
$ ls -R .git
HEAD # Указатель на активную ветку (symbolic ref)
config # Локальный конфигурационный файл репозитория
description # Описание репозитория (чаще используется в bare репо)
hooks/ # Скрипты-хуки (pre-commit, post-commit и т.д.)
info/ # Дополнительная информация (например excludes)
objects/ # Хранилище всех объектов (коммиты, деревья, блобы, теги)
refs/ # Ссылки на ветки и теги (heads, tags, remotes)
Обратите внимание, что сами файлы проекта пока нигде не зафиксированы. Репозиторий "пустой": у него нет ни одного коммита, нет веток, и история еще не началась. Вы просто подготовили инфраструктуру для дальнейшей работы.
Понятие "пустого" репозитория
После git init вы можете увидеть подобное состояние:
$ git status
On branch master
No commits yet # В репозитории еще нет ни одного коммита
nothing to commit (create/copy files and use "git add" to track)
Git уже создал "техническую" ветку (обычно master или main, зависит от настроек), но эта ветка пока не содержит ни одного снимка состояния файлов. С первым коммитом история будет запущена.
Давайте разберемся, что именно нужно сделать после git init.
Базовый сценарий: с нуля до первого коммита
Шаг 1. Инициализируем репозиторий
Допустим, у вас есть папка проекта:
$ mkdir my-project # Создаем каталог проекта
$ cd my-project # Переходим в каталог
$ git init # Инициализируем Git-репозиторий
Комментарии к происходящему:
- mkdir my-project — создаете обычную папку;
- git init — превращаете папку в Git‑репозиторий, добавляя .git.
Шаг 2. Добавляем файлы
Теперь создадим простой файл, чтобы было с чем работать:
$ echo "print('Hello, Git')" > app.py # Создаем файл с простым кодом
$ ls
app.py # В папке пока только этот файл
Пока Git лишь знает, что в рабочем каталоге появились новые файлы. Они не отслеживаются.
Проверим статус:
$ git status
On branch master
No commits yet
Untracked files: # Файлы, которые Git видит, но не отслеживает
(use "git add <file>..." to include in what will be committed)
app.py
nothing added to commit but untracked files present
Шаг 3. Индексация (staging) файлов
Чтобы включить файл в первый коммит, добавьте его в индекс:
$ git add app.py # Помещаем файл в "staging area"
Что это значит:
- Рабочая директория — ваши реальные файлы на диске;
- Индекс (staging area) — промежуточное состояние, которое готовится к коммиту;
- Коммит — зафиксированная точка в истории.
Еще раз проверим статус, чтобы увидеть изменения:
$ git status
On branch master
No commits yet
Changes to be committed: # То, что попадет в следующий коммит
(use "git rm --cached <file>..." to unstage)
new file: app.py
Здесь вы видите, что app.py будет включен в следующий коммит.
Шаг 4. Создаем первый коммит
Теперь зафиксируем состояние:
$ git commit -m "Initial commit" # Делаем первый коммит с сообщением
Комментарии:
- -m "Initial commit" — краткое сообщение, описывающее изменения;
- В этот момент создается первый объект commit в .git/objects.
После этого команда git status покажет:
$ git status
On branch master
nothing to commit, working tree clean # Рабочая директория совпадает с последним коммитом
На этом базовая последовательность "git init → git add → git commit" завершена. У вас появился полноценный локальный репозиторий с историей.
Где и когда использовать git init
Новый проект "с нуля"
Самый очевидный сценарий — вы начинаете новый проект и хотите отслеживать изменения с первых шагов. В этом случае:
- Создаете папку;
- Выполняете git init;
- Добавляете файлы, делаете первый коммит.
Это удобный способ сразу выстроить разумную структуру проекта и историю изменений, даже если изначально проект маленький.
Подключение Git к существующему проекту
Часто бывает наоборот: у вас уже есть папка с кодом, но система контроля версий не использовалась. Например:
$ cd existing-project # Переходим в существующую директорию
$ ls
src/ docs/ data/ script.sh # Здесь уже есть файлы и папки
$ git init # Инициализация Git в существующем проекте
Дальше вы:
$ git add . # Добавляем все текущие файлы в индекс
$ git commit -m "Initial commit for existing project"
Здесь важно понимать: в первый коммит попадет уже "готовое" состояние проекта. Git не знает, какие изменения были до этого момента. История начинается с текущего состояния как с точки отсчета.
Инициализация вложенных репозиториев
Иногда разработчики по ошибке выполняют git init внутри уже существующего репозитория (внутри дочерней папки). Это создает "репозиторий в репозитории", что почти всегда приводит к путанице.
Проверить, нет ли уже репозитория выше по дереву каталогов, можно так:
$ git rev-parse --show-toplevel
# Показывает путь к корню текущего репозитория, если вы внутри него
Если команда возвращает путь, значит вы уже находитесь в репозитории, и новый git init делать не нужно, если только вы осознанно не создаете вложенный репозиторий как отдельный проект (обычно это не рекомендуется).
Опции git init: что полезно знать
Команда git init имеет ряд опций, которые часто игнорируются новичками, но могут быть полезны в реальных проектах.
Изменение директории репозитория
Вы можете инициализировать репозиторий не только в текущем каталоге, но и в указанной папке:
$ git init my-project # Создает папку my-project и инициализирует там репозиторий
$ git init . # Явно указывает, что инициализацию делаем в текущем каталоге
Обратите внимание:
- git init my-project — создаст папку, если ее нет, и внутри нее папку .git;
- git init . — полезно, если вы уже внутри нужного каталога.
Создание bare-репозитория
Bare‑репозиторий — это репозиторий без рабочей директории. Там нет "живых" файлов проекта, а только содержимое папки .git. Такой тип обычно используют как центральный удаленный репозиторий (на сервере):
$ git init --bare my-project.git
Что происходит:
- Создается каталог my-project.git;
- В нем сразу лежит структура, похожая на обычную .git;
- Нет рабочей директории: вы не можете просто открыть файл проекта и отредактировать его здесь.
Например, структура может выглядеть так:
$ ls my-project.git
HEAD config description hooks/ info/ objects/ refs/
# Обратите внимание - нет обычных файлов проекта
Давайте разберемся, когда вам нужен bare‑репозиторий:
- Когда вы настраиваете "центральный" репозиторий на сервере, куда другие разработчики будут отправлять (push) свои изменения;
- Когда сервер не должен содержать рабочую копию (например, доступ только по SSH, без развертывания кода на этом же сервере).
Работать с таким репозиторием обычно не локально, а по протоколу (ssh, https):
$ git remote add origin user@server:/path/to/my-project.git # Подключаем удаленный repo
$ git push -u origin master # Отправляем локальную ветку master
Задание основного (initial) имени ветки
По умолчанию Git использовал имя master для первой ветки, но в новых версиях можно (и часто рекомендуется) использовать main или другое имя.
Есть несколько способов управлять этим.
- Однократно при инициализации:
$ git init --initial-branch=main # Сразу создаем ветку main вместо master
- Настройка по умолчанию для всех будущих репозиториев:
$ git config --global init.defaultBranch main
# Теперь любая новая команда git init создаст первую ветку с именем main
Эта настройка полезна, если вы следуете стандартам, где main является основной веткой.
Задание шаблонов (template) при инициализации
Git поддерживает шаблоны для новых репозиториев. Вы можете заранее настроить набор хуков, конфигураций и других файлов, которые будут копироваться в каждый новый репозиторий.
Пример:
$ git init --template=/path/to/my-git-template
В указанном каталоге шаблонов могут находиться:
- hooks/ с вашими преднастроенными скриптами;
- info/ с дополнительными настройками;
- другие служебные файлы.
Это уже более продвинутый сценарий, но он удобен, если вы в команде хотите унифицировать поведение всех локальных репозиториев.
Что происходит с git init повторно
Разберемся, что будет, если вы выполните git init в папке, которая уже является репозиторием.
Повторный git init в том же каталоге
Если вы выполните:
$ git init
Reinitialized existing Git repository in /path/to/project/.git/
Git не удалит историю и не "обнулит" репозиторий. Происходит следующее:
- Git проверяет, есть ли уже папка .git;
- Если есть — он переинициализирует структуру, не уничтожая объекты и ссылки;
- Это может обновить формат некоторых служебных файлов под новую версию Git.
То есть повторный git init относительно безопасен. Но делать его без необходимости смысла нет — он не "почистит" историю и не решит логические проблемы в ветках.
Опасные сценарии: удаление .git
Некоторые пытаются "починить" сломанный репозиторий, просто удаляя папку .git:
$ rm -rf .git # Полное удаление репозитория
$ git init # Создание нового "чистого" репозитория
Да, так вы создадите новый Git‑репозиторий, но:
- Полностью потеряете всю историю коммитов;
- Вся информация о ветках, тегах, удаленных репозиториях исчезнет.
Это вариант только в том случае, если вас действительно не интересует старая история, а нужны только текущие файлы как "новый проект".
Типичные ошибки и как их избежать
Ошибка 1. git init в "не том" каталоге
Часто разработчики случайно выполняют git init не в папке проекта, а где-то выше (например, в домашнем каталоге). Тогда Git начинает считать весь этот каталог репозиторием.
Проверить, где корень репозитория:
$ git rev-parse --show-toplevel
# Покажет путь к корню текущего репозитория
Если вы видите, что корень — это, например, /home/user, а вы этого не планировали, значит git init был вызван слишком высоко.
Как исправить:
- Убедитесь, что вам не нужна история изменений для всего этого каталога;
- Удалите .git в корневой папке:
$ rm -rf /home/user/.git # Будьте очень осторожны с rm -rf
- Вызовите git init уже в конкретной папке проекта.
Ошибка 2. Инициализация вместо клонирования
Если проект уже существует на удаленном сервере (GitHub, GitLab и т.п.), то вместо git init нужно использовать git clone. Иногда новички делают так:
$ mkdir my-project
$ cd my-project
$ git init # Лишний шаг
$ git remote add origin ...
$ git pull origin main # Или master
Это работает, но не оптимально. Правильнее сразу клонировать:
$ git clone https://example.com/user/repo.git
# Git сам создаст каталог, инициализирует репозиторий и скачает историю
Если вы уже сделали git init и начали настраивать remote, это не критично, но git clone экономит время и снижает риск ошибок.
Ошибка 3. Игнорирование .gitignore
После git init многие просто добавляют все файлы командой git add . и делают коммит. В результате в репозиторий попадают:
- временные файлы IDE;
- файлы сборки и артефакты;
- логи и другие не нужные в истории вещи.
Лучше еще до первого коммита создать файл .gitignore:
$ cat > .gitignore <<EOF
# Игнорируем директорию сборки
build/
dist/
# Игнорируем временные файлы редакторов
*.swp
*.tmp
# Игнорируем логи
*.log
EOF
Комментарии к фрагменту:
- build/ и dist/ — типичные каталоги с результатами сборки, их можно восстановить;
- .swp и .tmp — временные файлы редакторов;
- *.log — логи, которые не должны попасть в историю.
Затем:
$ git add .gitignore
$ git add . # Добавляем оставшиеся файлы проекта
$ git commit -m "Initial project structure"
Так вы не "засорите" репозиторий с самого начала.
Ошибка 4. Смешение ролей bare и обычного репозитория
Иногда разработчики по ошибке создают bare‑репозиторий там, где им нужен обычный, и наоборот. Напомню:
- Обычный репозиторий: git init — у вас есть рабочая директория и .git;
- Bare‑репозиторий: git init --bare — только структура Git, без файлов проекта.
Если вы выполнили git init --bare и затем оказались в каталоге и не видите файлов проекта — это ожидаемо. Но вы не сможете здесь редактировать код. Такой репозиторий предназначен только для push/pull.
Если вы хотели обычный репозиторий, создайте новую папку и выполните обычный git init (или git clone, если есть удаленный origin).
Настройка Git сразу после git init
Указание имени и email автора
Перед первым коммитом имеет смысл настроить имя и email, чтобы в истории были корректные данные. Если этого не сделать, Git может попросить вас заполнить эти значения при попытке сделать коммит.
Настройка глобально (для всех репозиториев на машине):
$ git config --global user.name "Ваше Имя" # Имя автора коммитов
$ git config --global user.email "you@example.com" # Email автора
Комментарии:
- Эти данные попадут в каждый коммит, который вы делаете;
- Их можно переопределить локально для конкретного репозитория:
$ git config user.name "Другое Имя" # Только для текущего репозитория
$ git config user.email "other@example.com"
Проверка конфигурации
Посмотреть текущие настройки:
$ git config --list
# Отображает все параметры - глобальные и локальные
Здесь вы увидите в том числе user.name, user.email и init.defaultBranch, если вы его задавали.
Практический пример: локальный и удаленный репозиторий
Давайте соберем все шаги воедино и посмотрим типичный сценарий: вы создаете проект локально и потом подключаете удаленный репозиторий.
Шаг 1. Локальная инициализация
$ mkdir demo-project
$ cd demo-project
$ git init # Локальное создание репозитория
$ git status # Проверяем состояние
Шаг 2. Добавляем файлы и .gitignore
$ echo "# Demo project" > README.md # Создаем README
$ echo "build/" > .gitignore # Игнорируем директорию build
$ git add README.md .gitignore # Ставим файлы в индекс
$ git commit -m "Initial commit with README" # Первый коммит
Комментарии:
- README.md — полезно иметь с описанием проекта с самого начала;
- .gitignore — помогает не тянуть в историю лишние файлы.
Шаг 3. Создаем удаленный репозиторий
Допустим, вы на GitHub создали пустой репозиторий demo-project (без автогенерации README, чтобы не было конфликтов при первом push).
Дальше привязываете локальный и удаленный репозитории:
$ git remote add origin git@github.com:username/demo-project.git # Настраиваем origin
$ git branch -M main # Переименовываем ветку master в main при необходимости
$ git push -u origin main # Отправляем первый коммит
Комментарии к фрагменту:
- git remote add origin — добавляет "ссылку" на удаленный репозиторий, имя origin принято по умолчанию;
- git branch -M main — принудительно переименовывает текущую ветку в main;
- git push -u origin main — первый push, с установкой upstream (ветка будет связана с origin/main).
Теперь у вас:
- локальный репозиторий, инициализированный через git init;
- удаленный репозиторий, куда можно отправлять и откуда можно получать изменения.
Заключение
Команда git init — это отправная точка для любого нового локального репозитория Git. Она создает структуру данных в скрытой папке .git, подготавливая проект к отслеживанию изменений. Сама по себе git init не добавляет файлы и не создает коммиты — это делают последующие команды git add и git commit.
Важно понимать:
- где вы вызываете git init, чтобы не превратить в репозиторий лишний каталог;
- чем отличается обычный репозиторий от bare‑репозитория и в каких случаях нужен каждый из них;
- как настроить имя ветки по умолчанию и базовые параметры Git (user.name, user.email, init.defaultBranch);
- почему стоит подумать о .gitignore уже перед первым коммитом.
Разобравшись с этими моментами, вы сможете осознанно и предсказуемо создавать и настраивать репозитории под реальные задачи: от локальных учебных проектов до командной работы с удаленными серверами.
Частозадаваемые технические вопросы по теме и ответы
Как инициализировать репозиторий в уже существующей папке, но не добавлять сразу все файлы в историю
- Перейдите в папку проекта.
- Выполните git init.
- Создайте .gitignore, чтобы исключить лишние файлы.
- Используйте git status, чтобы увидеть список неотслеживаемых файлов.
- Добавляйте только нужные файлы выборочно:
git add path/to/file1 path/to/file2 - После этого сделайте коммит:
git commit -m "Initial minimal commit".
Как понять, bare у меня репозиторий или нет, если я попал в папку на сервере
- Выполните ls.
- Если вы видите файлы HEAD, config, objects, refs прямо в текущем каталоге и нет исходников проекта — почти наверняка это bare‑репозиторий.
- Дополнительно проверьте:
git rev-parse --is-bare-repository - Если ответ true — репозиторий bare и редактировать код здесь нельзя, только использовать как удаленный.
Можно ли изменить имя initial ветки после git init, если я уже сделал первый коммит
Да:
- Убедитесь, что на ветке нет опубликованных изменений (иначе потребуется согласование с командой).
- Переименуйте ветку:
git branch -m master main - Если есть удаленный репозиторий, отправьте новую ветку:
git push -u origin main - При необходимости удалите старую ветку на сервере:
git push origin --delete master.
Что делать, если я случайно выполнил git init внутри уже существующего репозитория (вложенный .git)
- Найдите вложенный .git:
find . -name ".git" -type d - Если вложенный репозиторий был создан по ошибке и вы не делали в нем осознанных коммитов — удалите его:
rm -rf path/to/subdir/.git - Вернитесь в корень основного репозитория и проверьте состояние:
git status.
Как инициализировать репозиторий так, чтобы он сразу был привязан к удаленному (без git clone)
Автоматически связать init и remote одной командой нельзя, но можно быстро сделать последовательность:
- git init
- git remote add origin
- git add .
- git commit -m "Initial commit"
- git push -u origin master (или main).
Так вы получаете эффект, похожий на git clone, но с локального проекта, который вы создали сами.
Постройте личный план изучения Git до уровня Middle — бесплатно!
Git — часть карты развития Frontend
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Бесплатные лекции
Все гайды по Git
Лучшие курсы по теме

Основы Git
Антон Ларичев
TypeScript с нуля
Антон Ларичев