$ sudo teach IT
Модуль 2 · Первые коммиты · Урок 2.1

Первый репозиторий

Вы превратите папку проекта в репозиторий Git и научитесь спрашивать у Git, что в ней происходит.

Теория + практика~15 минутНовичокgit initgit status

Что такое репозиторий

Репозиторий в Git — это обычная папка с вашим проектом, внутри которой Git хранит всю историю изменений файлов. Сегодня вы превратите пустую папку portfolio в репозиторий командой git init и впервые спросите у Git, что в ней происходит, командой git status.

Git уже установлен и настроен, а папка ~/projects/portfolio создана. Но Git о ней пока ничего не знает: для него это просто пустая папка, как любая другая. Чтобы он начал следить за проектом, папку нужно объявить репозиторием.

Простыми словами

Представьте рабочий блокнот, в который вы не просто пишете, а ещё и ведёте журнал: что изменили, когда и зачем. Репозиторий — это ваш проект плюс такой журнал, который Git ведёт сам. Файлы лежат там, где всегда лежали, а журнал хранится рядом, в скрытой папке.

Официальный термин

Репозиторий (repository, в разговоре — «репо») — папка проекта вместе с базой данных Git. Эта база лежит в скрытой подпапке .git в корне проекта. Скрытой она называется потому, что её имя начинается с точки: обычный ls такие папки не показывает, а ls -a (a — от all, «все») показывает.

Папку .git не трогайте руками

Вся история проекта живёт в .git. Если удалить эту папку, ваши файлы останутся на месте, но история исчезнет безвозвратно: проект снова станет обычной папкой. Не правьте, не переименовывайте и не переносите содержимое .git — все действия с историей делайте командами Git.

Команда git init

Команда git init (от initialize, «инициализировать») создаёт в текущей папке ту самую скрытую папку .git — пустую базу, готовую принять историю. Запускать её нужно один раз на проект и строго в корне проекта, то есть в portfolio, а не в домашней папке и не в projects.

Терминал
$ cd ~/projects/portfolio
$ git init
Initialized empty Git repository in /Users/alex/projects/portfolio/.git/

Разбор по строкам

  • cd ~/projects/portfolio — перейти в папку проекта. Без этого шага репозиторий появится не там.
  • git init — создать репозиторий в текущей папке.
  • Initialized empty Git repository in …/.git/ — «создан пустой репозиторий» и полный путь к новой папке .git. Путь у вас будет свой: на Mac и Linux он начинается с /Users/… или /home/…, в Git Bash на Windows вы увидите, например, C:/Users/alex/projects/portfolio/.git/.

Ничего в ваших файлах команда не меняет. Проверить, что папка .git появилась, можно через ls -a:

Терминал
$ ls -a
.  ..  .git

Точка и две точки — служебные записи «эта папка» и «папка выше», они есть везде. Новая здесь только .git.

Подробно — в документации: git init.

git status: главный вопрос

git status отвечает на вопрос «что сейчас происходит в проекте?». Эту команду вы будете запускать чаще всех остальных: перед каждым действием и после него. Она ничего не меняет, только рассказывает, поэтому бояться её не нужно.

Терминал
$ git status
On branch main

No commits yet

nothing to commit (create/copy files and use "git add" to track)

Разбор по строкам

  • On branch main — «вы на ветке main». Ветка — это линия истории; пока считайте, что main — это просто имя вашей основной истории. Ветки мы разберём позже. Если здесь написано master, смотрите выноску в конце урока.
  • No commits yet — «коммитов ещё нет». Коммит (commit) — это сохранённая в истории версия проекта. История пока пуста.
  • nothing to commit (create/copy files and use "git add" to track) — «фиксировать нечего: создайте или скопируйте файлы и используйте git add, чтобы Git начал за ними следить». Git сам подсказывает следующий шаг.

Читайте подсказки Git

Вывод git status почти всегда содержит подсказки в скобках: какой командой двигаться дальше. Иногда там встретятся незнакомые команды, например git restore или git rm --cached. Это отмена действий; ей посвящён следующий модуль, а пока просто читайте и идите дальше.

Подробно — в документации: git status.

Отслеживаемые и неотслеживаемые файлы

Создайте в папке проекта файл index.html — каркас главной страницы визитки. Это ваш первый настоящий файл проекта: заголовок с именем, подзаголовок и раздел «Обо мне». Подставьте в заголовок своё имя, если хотите.

HTML · index.html
<!DOCTYPE html>
<html lang="ru">
<head>
  <meta charset="UTF-8">
  <title>Алекс Иванов - Визтка</title>
</head>
<body>
  <h1>Алекс Иванов</h1>
  <p class="lead">Начинающий веб-разработчик</p>
  <section id="about">
    <h2>Обо мне</h2>
    <p>Учусь программировать и делаю свой первый сайт.</p>
  </section>
</body>
</html>

Разбирать HTML не нужно, достаточно знать, что это за куски: <head> — служебная часть (кодировка и название вкладки браузера), <body> — то, что видно на странице. В названии вкладки (<title>) мы нарочно оставили маленькую опечатку. Не исправляйте её: она пригодится в конце модуля.

Теперь спросите Git, заметил ли он новый файл:

Терминал
$ git status
On branch main

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	index.html

nothing added to commit but untracked files present (use "git add" to track)

Разбор по строкам

  • Untracked files — «неотслеживаемые файлы». Git их видит, но в историю не берёт.
  • (use "git add <file>..." to include in what will be committed) — подсказка: чтобы файл попал в будущий коммит, нужен git add. Этим займёмся в следующем уроке.
  • index.html — сам файл, он выделен отступом.
  • nothing added to commit but untracked files present — «ничего не подготовлено к коммиту, но есть неотслеживаемые файлы».

Это важная идея. Файл в папке репозитория не попадает в историю автоматически. Git делит файлы на два вида:

Вид файлаЧто значитКак стать таким
Неотслеживаемый (untracked)Лежит в папке, но Git его не хранит и за изменениями не следитЛюбой новый файл
Отслеживаемый (tracked)Git знает о файле и следит за его изменениями: файл уже есть в последнем коммите или вы добавили его командой git addВыполнить git add (следующий урок)

Частая путаница: Git не хранит всё подряд

Новички думают, что Git сам сохраняет всё, что лежит в папке. На деле он следит только за теми файлами, которые вы ему явно показали. Это сделано специально: так в историю не попадают случайные и временные файлы.

Практика у себя

Сделайте по шагам. После каждого шага сверяйтесь с тем, что должно получиться.

Шаг 1. Откройте терминал (Git Bash на Windows) и перейдите в папку проекта:

Терминал
$ cd ~/projects/portfolio
$ pwd
/Users/alex/projects/portfolio

pwd печатает текущую папку. Путь должен заканчиваться на /projects/portfolio. В Git Bash на Windows он будет выглядеть как /c/Users/alex/projects/portfolio.

Шаг 2. Убедитесь, что папка пока не репозиторий:

Терминал
$ ls -a
.  ..

Шаг 3. Создайте репозиторий и проверьте, что появилась папка .git:

Терминал
$ git init
Initialized empty Git repository in /Users/alex/projects/portfolio/.git/
$ ls -a
.  ..  .git

Шаг 4. Спросите у Git, как дела. Должно получиться ровно то, что вы видели выше: On branch main, No commits yet и nothing to commit.

Терминал
$ git status

Шаг 5. Откройте папку в VS Code командой code . (точка означает «текущая папка»), создайте файл index.html, вставьте код из раздела выше и сохраните. Убедитесь, что файл лежит в корне portfolio, а не во вложенной папке.

Шаг 6. Снова запустите git status. Теперь в выводе должен появиться раздел Untracked files с одним файлом index.html.

Терминал
$ git status

Проверьте себя

  • В папке portfolio есть скрытая папка .git (её показывает ls -a).
  • git status начинается с On branch main и говорит No commits yet.
  • Файл index.html числится в Untracked files.
  • Вы можете своими словами объяснить, чем неотслеживаемый файл отличается от отслеживаемого.

Частые ошибки

fatal: not a git repository (or any of the parent directories): .git. «Это не репозиторий Git, и выше по папкам репозитория тоже нет». Вы запустили команду Git не в той папке или не выполнили git init. Проверьте pwd, перейдите в ~/projects/portfolio и повторите.

Reinitialized existing Git repository in … Вы запустили git init второй раз. Это не ошибка и ничего не ломает: Git сообщает, что репозиторий здесь уже есть, и оставляет историю как есть.

git init в домашней папке. Если выполнить команду, находясь в ~ (а не в ~/projects/portfolio), репозиторием станет вся ваша домашняя папка. Признак: git status выдаёт длинный список неотслеживаемых файлов из «Документов» и «Загрузок». Исправить просто: удалить лишнюю папку .git именно в домашней папке.

Удаляйте .git осторожно

Команда rm -rf ~/.git безвозвратно удаляет папку .git в домашней папке и всю её историю. Перед запуском убедитесь командой ls -a ~, что .git там действительно есть, и что вы не путаете её с папкой .git проекта portfolio. Файлы в домашней папке эта команда не затрагивает. После неё перейдите в ~/projects/portfolio и повторите git init.

Репозиторий внутри репозитория. Если git init выполнить дважды в разных местах — в portfolio и во вложенной папке, получится два репозитория, один внутри другого. Git считает вложенный «чужим» и не берёт его файлы во внешний репозиторий. Проверка простая: ls -a должен показывать .git только в portfolio, а не внутри его подпапок.

Вместо main написано master

Значит, настройка init.defaultBranch из прошлого модуля не сработала. Пока коммитов нет, исправить легко: выполните git config --global init.defaultBranch main, затем внутри portfolio удалите папку командой rm -rf .git (убедитесь по pwd, что вы именно в portfolio, иначе удалите чужую историю) и снова запустите git init.

Что важно запомнить

  • Репозиторий — папка проекта плюс скрытая папка .git с историей. Удалить .git — значит потерять историю.
  • git init выполняется один раз и только в корне проекта.
  • git status безопасна и показывает, что происходит; запускайте её чаще.
  • Новый файл по умолчанию неотслеживаемый: Git его видит, но не хранит, пока вы не попросите.

Остался вопрос: как попросить Git сохранить index.html в истории? Для этого нужны всего две команды, и ими мы займёмся в следующем уроке: сделаем первый коммит.

На следующий урок