Откуда берётся репозиторий
Репозиторий появляется одним из двух способов.
Создать новый. Зайти в папку проекта и выполнить 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, — изменение проходит три места.
- Рабочая папка — обычные файлы, которые вы открываете и правите.
- Индекс (его ещё называют staging area) — промежуточная зона: сюда вы кладёте то, что должно войти в следующий коммит.
- История — сделанные коммиты.
Зачем промежуточная зона? Чтобы собрать коммит из нужного. Вы поправили заголовок страницы и заодно начали переделывать меню. Заголовок готов, меню — нет. С индексом вы кладёте в коммит только заголовок, а меню остаётся в рабочей папке до готовности. Так выполняется первое правило курса: коммит — одно законченное изменение.
git add index.html
git commit -m "Исправить заголовок главной страницы"
После коммита в истории появляется новый снимок, и 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— то, что лежит в индексе и войдёт в коммит.
Минус — строка, как была; плюс — как стала. Изменена одна строка: исправлена опечатка.
Порядок работы, к которому стоит привыкнуть:
git status— что изменено;git diff— что именно;git add— нужные файлы;git diff --staged— ещё раз взглянуть на то, что войдёт;git commit -m "…"— сохранить.
Если набрать git commit без -m, Git откроет текстовый редактор, чтобы вы написали сообщение там. Это удобно для длинного сообщения с пояснением — о них в следующем уроке. Сохраните текст и закройте редактор — коммит будет сделан; пустое сообщение Git не примет и коммит отменит.
Команда git add . добавляет всё изменённое в текущей папке разом. Она удобна, но опасна именно тем, что не заставляет смотреть. Если пользуетесь ею — тем более смотрите git diff --staged перед коммитом.