урок 2 из 10

Репозиторий, коммит, статус

Создавать и копировать репозиторий, понимать три места изменения — рабочую папку, индекс и историю, — читать git status, смотреть изменения git diff и собирать коммит только из нужного.

8 мин чтения · 4 главы ·6 заданий ·домашняя работа

Откуда берётся репозиторий

Репозиторий появляется одним из двух способов.

Создать новый. Зайти в папку проекта и выполнить git init. Git создаст служебную папку .git — с этой минуты он готов вести историю. Файлы проекта при этом не меняются.

Скопировать существующий, обычно с сервиса для репозиториев: git clone и адрес репозитория. Git скачает всю историю целиком и создаст рабочую папку с последней версией файлов.

git clone https://example.com/team/site.git
cd site

Один раз на компьютере Git нужно представить себя — имя и почту он будет ставить автором каждого коммита:

git config --global user.name "Анна Петрова"
git config --global user.email "anna@example.com"

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

Три места

Главное, что нужно понять про Git, — изменение проходит три места.

Рабочаяпапка:вы правитеИндекс:что войдётв коммитИстория:коммитыgit add — из папки в индекс · git commit — из индекса в историю
Правка сначала появляется в рабочей папке. Командой git add вы кладёте её в индекс — «на подпись». Командой git commit всё, что лежит в индексе, становится новым коммитом в истории.
  • Рабочая папка — обычные файлы, которые вы открываете и правите.
  • Индекс (его ещё называют staging area) — промежуточная зона: сюда вы кладёте то, что должно войти в следующий коммит.
  • История — сделанные коммиты.

Зачем промежуточная зона? Чтобы собрать коммит из нужного. Вы поправили заголовок страницы и заодно начали переделывать меню. Заголовок готов, меню — нет. С индексом вы кладёте в коммит только заголовок, а меню остаётся в рабочей папке до готовности. Так выполняется первое правило курса: коммит — одно законченное изменение.

git add index.html
git commit -m "Исправить заголовок главной страницы"

После коммита в истории появляется новый снимок, и HEAD переезжает на него.

mainABCHEAD
После git commit в истории появляется новый снимок C, он ссылается на прошлый B, и отметка HEAD переезжает на него. Старые коммиты не меняются.

Индекс умеет и тоньше: если в одном файле две разные правки, команда git add -p покажет их по кускам и спросит про каждый — добавить или оставить. Так даже один файл можно разложить на два коммита. Пригождается это реже, чем кажется, но выручает, когда правки уже перемешались.

git status

Как узнать, что где лежит? Командой git status. Её стоит набирать постоянно — перед коммитом, после коммита, когда что-то непонятно. Она ничего не меняет и всегда безопасна.

git status
On branch main
Changes to be committed:
        modified:   index.html

Changes not staged for commit:
        modified:   style.css

Untracked files:
        notes.txt

Git часто пишет по-английски, но читать его вывод просто:

  • On branch main — вы в ветке main;
  • Changes to be committed — лежит в индексе и войдёт в коммит: здесь index.html;
  • Changes not staged for commit — изменено в рабочей папке, но в индекс не добавлено: style.css в коммит не войдёт;
  • Untracked files — новые файлы, о которых Git пока не знает: notes.txt.

Когда файлов много, удобен короткий вид — git status -s: по строке на файл, а буквы слева говорят о состоянии. M — изменён, A — добавлен в индекс новым, ?? — не отслеживается. Буква в первой колонке относится к индексу, во второй — к рабочей папке, поэтому «M » и « M» означают разное: в первом случае правка уже в индексе, во втором — ещё нет.

Если git status пишет, что изменений нет (nothing to commit, working tree clean), значит рабочая папка совпадает с последним коммитом. Это хорошее состояние, чтобы переключаться между задачами.

git diff перед коммитом

Перед коммитом полезно увидеть не только какие файлы изменены, но и что в них изменилось. Для этого git diff.

  • git diff — изменения в рабочей папке, ещё не добавленные в индекс;
  • git diff --staged — то, что лежит в индексе и войдёт в коммит.
index.html
 <header>
- <h1>Добро пожаловат</h1>
+ <h1>Добро пожаловать</h1>
 </header>

Минус — строка, как была; плюс — как стала. Изменена одна строка: исправлена опечатка.

Порядок работы, к которому стоит привыкнуть:

  1. git status — что изменено;
  2. git diff — что именно;
  3. git add — нужные файлы;
  4. git diff --staged — ещё раз взглянуть на то, что войдёт;
  5. git commit -m "…" — сохранить.

Если набрать git commit без -m, Git откроет текстовый редактор, чтобы вы написали сообщение там. Это удобно для длинного сообщения с пояснением — о них в следующем уроке. Сохраните текст и закройте редактор — коммит будет сделан; пустое сообщение Git не примет и коммит отменит.

Команда git add . добавляет всё изменённое в текущей папке разом. Она удобна, но опасна именно тем, что не заставляет смотреть. Если пользуетесь ею — тем более смотрите git diff --staged перед коммитом.

Задания урока

Первые задание решается прямо здесь — без регистрации. Щёлкните по ответу.

  1. 1. Какая команда покажет, что войдёт в коммит?

Остальные задания урока — в курсе, с сохранением прогресса и разбором ошибок.

  1. Разложите: команда создаёт репозиторий или копирует существующий.легко
  2. Расставьте путь правки до истории.легко
  3. После git add файл уже сохранён в истории.средне
  4. Сопоставьте раздел вывода git status и смысл.средне
  5. Что верно о git status?средне
Пройти урок с проверкой заданий Курс «Git и работа в команде» открыт и бесплатен, прогресс сохраняется.
Открыть курс