Базовые команды Git: init, status, add, commit, log
- Создавать репозиторий и выполнять рабочий цикл — редактирование, add, commit
- Читать и понимать вывод
git statusв любом состоянии - Просматривать историю через
git logи изменения черезgit diff - Настраивать
.gitignoreдля файлов, которые не должны попасть в репозиторий
Что мы изучим?
Ежедневный рабочий цикл с Git, команда за командой:
| Команда | Что делает |
|---|---|
git init | Создаёт репозиторий |
git status | Каково сейчас состояние? |
git add | Помещает изменения в Staging |
git commit | Сохраняет снимок в историю |
git log | Показывает историю |
git diff | Показывает, что изменилось |
И дополнительно: .gitignore — как сказать Git «игнорируй это».
Зачем это нужно?
Это команды, которые разработчики выполняют десятки раз в день. Отныне каждое упражнение и каждый проект курса будут вестись в Git: во-первых, потому что это профессиональная привычка, а во-вторых, потому что в проектах ООП и в интеграционном проекте история спасёт вас, когда что-то сломается.
Объяснение с основ
Рабочий цикл
1. edit files (Working Directory changes)
2. git status (see what changed)
3. git add <files> (choose what goes into the snapshot)
4. git commit -m "..." (save the snapshot)
5. repeatgit status — самая важная команда
git status ничего не меняет. Она только сообщает состояние: что Untracked, что Modified, что Staged. Золотое правило: перед каждым add и перед каждым commit выполняйте git status.
Сообщение Commit
Сообщение объясняет, что изменилось и зачем, для того, кто будет читать историю (включая вас через месяц). Подробнее о правилах — в следующем уроке. Пока: короткое предложение на английском в повелительном наклонении: "Add discount calculation", "Fix crash on empty cart".
.gitignore
Не каждый файл должен попасть в репозиторий:
- Файлы, которые создаются автоматически:
__pycache__/,*.pyc. - Личная или секретная информация: пароли, ключи API, файлы
.env. Они не должны попасть на GitHub! - Локальные рабочие файлы: логи (
*.log), локальная база данных, виртуальные окружения (venv/, мы встретим их в темах бэкенда и баз данных). - Системные файлы:
.DS_Store(Mac),Thumbs.db(Windows).
Файл с именем .gitignore в папке проекта содержит шаблоны (по одному на строку), и Git просто не «видит» соответствующие им файлы.
Синтаксис
git init # create a repository in the current folder
git status # show the state of files
git add file.py # stage one file
git add folder/ # stage everything in a folder
git add . # stage ALL changes in the current folder (check status first!)
git commit -m "Short message" # commit staged changes with a message
git log # full history (press q to quit)
git log --oneline # compact history, one line per commit
git diff # changes NOT yet staged
git diff --staged # changes that ARE staged (will go into the commit)
git restore --staged file.py # un-stage a file (keeps your edits)Пример .gitignore для проекта на Python:
# Python cache
__pycache__/
*.pyc
# Local data and logs
*.log
*.db
# Secrets and environments
.env
venv/
# OS files
.DS_Store
Thumbs.db# = комментарий. * = «что угодно». Строка, которая заканчивается на /, = папка.
Первый пример кода
Полный рабочий цикл с нуля. Внутри kodkod6:
mkdir calculator
cd calculator
git initСоздайте calculator.py:
def add(a, b):
return a + bА теперь:
git status
git add calculator.py
git status
git commit -m "Add calculator with add function"
git log --onelineВывод:
On branch main
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
calculator.py
nothing added to commit but untracked files present (use "git add" to track)On branch main
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: calculator.py[main (root-commit) 4e7a1c2] Add calculator with add function
1 file changed, 2 insertions(+)
create mode 100644 calculator.py4e7a1c2 (HEAD -> main) Add calculator with add functionРазбор кода построчно
| Вывод | Значение |
|---|---|
On branch main | Мы на главной ветке main. (Ветки — продвинутая тема, которой мы сейчас заниматься не будем.) |
No commits yet | Репозиторий новый, истории нет. |
Untracked files: calculator.py | Git видит новый файл, но не отслеживает его. |
Changes to be committed: new file | После add: файл в Staging и войдёт в следующий Commit. |
[main (root-commit) 4e7a1c2] | Создан Commit. root-commit = первый в истории. 4e7a1c2 = начало его Hash. |
1 file changed, 2 insertions(+) | Итог: один файл, добавлено 2 строки. |
(HEAD -> main) | HEAD = «где мы сейчас», последний Commit на ветке main. |
Обратите внимание: git status сам подсказывает, что делать (use "git add <file>..."). Читайте его подсказки!
Ещё один пример
Изменение, diff и второй Commit. Добавьте в calculator.py:
def subtract(a, b):
return a - bgit status
git diff
git add calculator.py
git commit -m "Add subtract function"
git loggit status:
Changes not staged for commit:
modified: calculator.pygit diff:
diff --git a/calculator.py b/calculator.py
--- a/calculator.py
+++ b/calculator.py
@@ -1,2 +1,6 @@
def add(a, b):
return a + b
+
+
+def subtract(a, b):
+ return a - bgit log:
commit 9d02b6f5e1a8c7d3b4f2e6a9c0d1e8b7f6a5c4d3 (HEAD -> main)
Author: Dana Cohen <dana@example.com>
Date: Tue Oct 6 11:20:41 2026 +0300
Add subtract function
commit 4e7a1c2b8f0d6e5a3c1b9d7f4e2a0c8b6d5f3e1a
Author: Dana Cohen <dana@example.com>
Date: Tue Oct 6 11:05:12 2026 +0300
Add calculator with add functionРазбор:
modified:— файл известен Git (он был в Commit), и он изменился.- В
git diffстрока, которая начинается с+, добавлена, строка с-удалена, а строка с пробелом — неизменный контекст.@@ -1,2 +1,6 @@= «строки 1–2 старой версии стали строками 1–6 новой». git logпоказывает от новых к старым: полный Hash, автора, дату и сообщение. Чтобы выйти из длинногоgit log: клавишаq.
А теперь .gitignore: запустите код один раз (python -c "import calculator"), и git status покажет __pycache__/ как Untracked. Создайте .gitignore с __pycache__/, и git status перестанет его показывать. Не забудьте: git add .gitignore и Commit. Сам этот файл должен быть в репозитории.
Типичная ошибка
Ошибка 1: git add . без проверки status. add . добавляет всё, включая логи, __pycache__ и, хуже всего, файлы с паролями. Сначала git status, сначала .gitignore, и только потом add ..
А если вы по ошибке добавили что-то в Staging:
git restore --staged secrets.txtФайл уходит из Staging, а изменения в нём остаются.
Ошибка 2: Commit без -m. Один git commit открывает текстовый редактор для сообщения. Если вы не настроили core.editor, обычно откроется Vim — редактор, из которого «трудно выйти». Если вы застряли в Vim: Esc, затем наберите :q! и Enter (выйти без сохранения), а потом запустите снова с -m "...".
Ошибка 3: бессмысленные сообщения.
a1b2c3d fix
e4f5a6b stuff
c7d8e9f asdf
f0a1b2c finalЧерез месяц никто не поймёт, что происходило в этой истории. Каждый Commit — «письмо в будущее».
Ошибка 4: добавить в .gitignore файл, который уже был закоммичен. .gitignore действует только на файлы, которые Git ещё не отслеживает. Если app.log уже в репозитории, нужно ещё и прекратить его отслеживать: git rm --cached app.log, а затем Commit.
Практика
Упражнения опираются только на то, что пройдено в этом уроке и в предыдущих. Сначала попробуйте сами, и только потом открывайте решение.
Упражнение 1: Первый Commit
В новой папке есть файл calculator.py. Напишите последовательность команд, которая создаёт репозиторий, проверяет состояние, добавляет файл и делает первый Commit с подходящим сообщением.
Показать решение
git init
git status
git add calculator.py
git commit -m "Add calculator with add and subtract"
git statusgit init— создаёт репозиторий.- Первый
git status— показывает, чтоcalculator.pyUntracked. git add— переносит его в Staging Area.git commit -m— сохраняет снимок с сообщением.git statusв конце — показывает nothing to commit, working tree clean.
Упражнение 2: Читаем git status
Changes to be committed:
modified: calculator.py
Changes not staged for commit:
modified: README.md
Untracked files:
notes.txtДля каждого файла — в каком он состоянии и что с ним будет, если сейчас выполнить git commit -m "Update"?
Показать решение
| Файл | Состояние | Войдёт в следующий Commit? |
|---|---|---|
calculator.py | Изменение в Staging Area | Да |
README.md | Изменён, но не добавлен через git add | Нет |
notes.txt | Untracked — Git его вообще не отслеживает | Нет |
В Commit входит только то, что находится в Staging Area.
Упражнение 3: .gitignore
В проекте на Python есть:
main.py
calculator.py
__pycache__/
secrets.txt (passwords)
app.log
README.mdНапишите подходящий файл .gitignore и объясните, зачем в нём каждая строка.
Показать решение
# Python cache
__pycache__/
*.pyc
# Passwords and keys
secrets.txt
# Logs
*.log__pycache__/— файлы, которые Python создаёт автоматически. Хранить их незачем.secrets.txt— пароли в Git не кладут, никогда. Что попало в историю, в ней и остаётся.*.log— логи меняются при каждом запуске и относятся к компьютеру, на котором он был.
main.py, calculator.py и README.md — сам проект, они входят.
Упражнение 4: Читаем git diff
-def add(a, b):
- return a - b
+def add(a, b):
+ return a + b- Что означают строки, которые начинаются с
-и+? - В чём фактическое изменение и какое сообщение Commit ему подходит?
Показать решение
-— строка, которая была и была удалена.+— новая строка, которая была добавлена.- Функция
addвычитала вместо сложения, и изменение это исправляет. Подходящее сообщение:Fix add returning a - b.
git diff показывает, что изменилось до git add, — его стоит выполнять перед каждым Commit, чтобы убедиться, что входит только то, что вы задумали.
Упражнение 5: История с git log
e91d5aa Fix VAT rounding
7b2e004 Add price calculator
a3f9c21 Initial project- Какая команда показывает историю по одной строке на Commit?
- Какой Commit самый старый, а какой последний?
- Добавьте функцию
multiply, а затемdivide. Сколько Commit вы бы сделали и почему?
Показать решение
git log --oneline.- Самый старый:
a3f9c21 Initial project(внизу). Последний:e91d5aa Fix VAT rounding(вверху). - Два Commit — по одному на каждую функцию:
Add multiply, а затемAdd divide. Так каждый Commit — одно изменение, и история рассказывает понятную историю. Еслиdivideокажется проблемной, легко увидеть, когда и что именно было добавлено.
Итоги
- Цикл: редактирование →
git status→git add→git commit -m "...". git status= «каково состояние?». Выполняйте перед каждым действием и читайте подсказки.git log --oneline= история.git diff= что изменилось (--staged= что войдёт в Commit).git add .— только послеstatusи.gitignore.git restore --stagedвыводит файл из Staging..gitignore:__pycache__/, логи,.env, секреты. Сам он входит в репозиторий.