Что такое репозиторий
Репозиторий в 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 — каркас главной страницы визитки. Это ваш первый настоящий файл проекта: заголовок с именем, подзаголовок и раздел «Обо мне». Подставьте в заголовок своё имя, если хотите.
<!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 в истории? Для этого нужны всего две команды, и ими мы займёмся в следующем уроке: сделаем первый коммит.