Установка Git и первая настройка
Перед первой командой проверьте, есть ли Git в системе. Откройте терминал (на Windows подойдет Git Bash или PowerShell) и выполните:
git --version
Если в ответ пришла строка вида git version 2.x, все готово. Если команда не найдена, скачайте установщик с git-scm.com или поставьте пакет: на Windows через winget install --id Git.Git -e --source winget, на Ubuntu через sudo apt install git, на macOS через brew install git. По данным git-scm.com на октябрь 2026 года, актуальная ветка - 2.55, но для всех команд из этой шпаргалки подойдет любая версия начиная с 2.23.
Дальше Git нужно представить. Имя и почта попадут в каждый коммит, поэтому их задают один раз глобально:
git config --global user.name "Ivan Petrov"
git config --global user.email "ivan@example.com"
git config --global init.defaultBranch main
git config --global core.editor "code --wait"
git config --list
Третья строка делает так, чтобы новые репозитории сразу создавались с веткой main, как на GitHub. Четвертая назначает редактором VS Code: он откроется, когда Git попросит ввести сообщение коммита. Последняя команда показывает все текущие настройки, удобно для проверки.
Основные команды Git: init, status, add, commit
Почти вся ежедневная работа укладывается в короткий цикл: изменил файлы, посмотрел статус, добавил в индекс, закоммитил. Индекс (staging area) - промежуточная зона, куда вы складываете то, что войдет в следующий коммит. Благодаря ей можно сохранить только часть правок.
- Создать репозиторий. В папке проекта выполните
git init. Появится скрытая папка.gitс историей. - Посмотреть состояние.
git statusпокажет новые, измененные и добавленные в индекс файлы. Короткий вид даетgit status -s. - Добавить изменения.
git add main.pyдобавит один файл,git add .- все из текущей папки,git add -pпозволит выбрать отдельные куски кода. - Зафиксировать.
git commit -m "Добавил парсер CSV"создаст коммит с сообщением. - Проверить историю.
git log --onelineвыведет список коммитов в одну строку.
mkdir demo && cd demo
git init
echo "print('hi')" > app.py
git status -s
git add app.py
git commit -m "Первый коммит"
git log --oneline
Если файл уже отслеживается и вы просто его поменяли, можно сократить два шага до одного: git commit -am "Поправил вывод". Флаг -a сам добавит измененные файлы, но новые (неотслеживаемые) пропустит.
Что не стоит коммитить
Папки node_modules, venv, __pycache__, файлы .env с паролями и ключами в репозиторий не кладут. Перечислите их в файле .gitignore в корне проекта, по одному шаблону на строку. Если файл уже попал в индекс, уберите его командой git rm --cached .env, а потом добавьте в .gitignore. Про виртуальные окружения Python подробно рассказано в статье как создать venv.
Просмотр истории и изменений: log, diff, show
Чтобы понимать, что происходит в проекте, хватает трех команд. git diff показывает, что изменилось в рабочих файлах и еще не добавлено в индекс. git diff --staged показывает то, что уже в индексе и войдет в коммит. git show <hash> раскрывает конкретный коммит со всеми правками.
git log --oneline --graph --all
git log -p -- app.py
git log --author="Ivan" --since="2 weeks ago"
git blame app.py
Первая строка рисует граф всех веток прямо в терминале, удобно перед слиянием. Вторая выводит историю одного файла вместе с изменениями. Третья фильтрует коммиты по автору и дате. git blame подписывает каждую строку файла: кто и в каком коммите ее последним менял.
Хеш коммита не нужно копировать целиком, Git понимает первые 7 символов. А HEAD означает текущий коммит, HEAD~1 - предыдущий, HEAD~3 - три шага назад.
Ветки в Git: branch, switch, merge
Ветка - это подвижный указатель на коммит. Новую функцию или исправление удобно делать в отдельной ветке, чтобы main оставалась рабочей. Раньше для всего использовали git checkout, с версии 2.23 появились более понятные git switch (переключение веток) и git restore (восстановление файлов). Старые команды тоже работают.
| Задача | Команда |
|---|---|
| Список локальных веток | git branch |
| Все ветки, включая удаленные | git branch -a |
| Создать ветку и перейти в нее | git switch -c feature/login |
| Перейти в существующую ветку | git switch main |
| Переименовать текущую ветку | git branch -m new-name |
| Удалить слитую ветку | git branch -d feature/login |
| Удалить ветку принудительно | git branch -D feature/login |
| Влить ветку в текущую | git merge feature/login |
| Перенести коммиты поверх main | git rebase main |
Как разрешить конфликт слияния
Конфликт возникает, когда две ветки поменяли одни и те же строки. Git остановит слияние и отметит спорные места маркерами:
<<<<<<< HEAD
print("Привет")
=======
print("Hello")
>>>>>>> feature/login
- Откройте файл и оставьте нужный вариант (или объедините оба), удалив маркеры.
- Выполните
git add app.py, чтобы пометить конфликт решенным. - Завершите слияние командой
git commit(при rebase -git rebase --continue). - Если запутались, откатитесь к состоянию до слияния:
git merge --abort.
Rebase делает историю линейной, но переписывает хеши коммитов. Правило простое: не делайте rebase веток, которые уже отправлены на сервер и с которыми работают коллеги.
Работа с удаленным репозиторием: clone, push, pull, fetch
Удаленный репозиторий (remote) - копия проекта на сервере: GitHub, GitLab, Gitflic или своем. По умолчанию он называется origin.
git clone https://github.com/user/project.git
git remote -v
git remote add origin git@github.com:user/project.git
git push -u origin main
git pull
git fetch
git push origin --delete old-branch
Разница между fetch и pull часто путает новичков. git fetch только скачивает новые коммиты с сервера и обновляет ветки вида origin/main, ваши файлы не трогает. git pull делает fetch и сразу сливает изменения в текущую ветку. Если хотите сначала посмотреть, что пришло, используйте fetch, а затем git log main..origin/main.
Флаг -u при первом push связывает локальную ветку с удаленной. После этого достаточно писать просто git push и git pull. Как создать репозиторий на сайте, настроить SSH-ключ и открыть pull request, разобрано в отдельном гайде GitHub для начинающих.
Как отменить изменения: restore, reset, revert
Отмена - самая нервная часть Git. Команд несколько, и они действуют на разные уровни: рабочие файлы, индекс, историю. Сведем их в таблицу.
| Ситуация | Команда | Опасность |
|---|---|---|
| Отменить правки в файле до последнего коммита | git restore app.py | Правки пропадут |
| Убрать файл из индекса, правки оставить | git restore --staged app.py | Безопасно |
| Исправить сообщение последнего коммита | git commit --amend -m "Новый текст" | Меняет хеш |
| Отменить последний коммит, правки вернуть в индекс | git reset --soft HEAD~1 | Безопасно локально |
| Отменить коммит, правки оставить в файлах | git reset HEAD~1 | Безопасно локально |
| Удалить коммит вместе с правками | git reset --hard HEAD~1 | Правки пропадут |
| Отменить уже отправленный коммит | git revert <hash> | Безопасно, создает новый коммит |
Главное правило: для коммитов, которые уже лежат на сервере, используйте revert, а не reset. Revert не переписывает историю, он добавляет коммит с обратными изменениями, и у коллег ничего не ломается.
Удалили коммит через reset --hard и пожалели? Выполните git reflog: Git хранит журнал всех перемещений HEAD примерно 90 дней. Найдите нужный хеш и верните его командой git reset --hard <hash>. Это спасает в большинстве случаев, кроме незакоммиченных правок - их reflog не видит.
Stash, теги и cherry-pick
git stash прячет незакоммиченные изменения в отдельное хранилище и возвращает чистое рабочее дерево. Типичный сценарий: вы на середине задачи, а нужно срочно переключиться на другую ветку и поправить баг.
git stash push -m "недописанная форма"
git switch hotfix
# ... правите баг, коммитите ...
git switch feature/form
git stash list
git stash pop
pop применяет последние спрятанные изменения и удаляет их из списка, apply применяет и оставляет. Новые файлы stash по умолчанию не прячет, для них нужен флаг -u.
Теги помечают версии релизов: git tag -a v1.0 -m "Релиз 1.0". На сервер они сами не уходят, их отправляют отдельно: git push origin v1.0 или git push --tags.
git cherry-pick <hash> переносит один конкретный коммит из другой ветки в текущую. Пригодится, когда исправление сделали в feature-ветке, а нужно оно в main уже сейчас.
Частые ошибки Git и как их исправить
Ниже сообщения, которые новички видят чаще всего, и что с ними делать.
- fatal: not a git repository. Вы находитесь не в папке проекта или забыли
git init. Проверьте путь командойpwd. - rejected ... (fetch first). На сервере есть коммиты, которых нет у вас. Сначала
git pull, затемgit push. Не используйтеpush --forceв общих ветках, вы сотрете чужую работу. Если очень нужно, есть более безопасный--force-with-lease. - Please tell me who you are. Не заданы
user.nameиuser.email, вернитесь к первому разделу. - detached HEAD. Вы переключились на конкретный коммит, а не на ветку. Если сделали там правки, сохраните их в новой ветке:
git switch -c rescue. - Закоммитили пароль. Удаление файла новым коммитом не помогает, ключ остается в истории. Сразу смените пароль или отзовите токен, а историю чистите инструментом вроде git filter-repo.
- Your branch is behind 'origin/main'. Это не ошибка, а подсказка: на сервере есть свежие коммиты. Выполните
git pull.
Если Git на Windows ругается на окончания строк (LF will be replaced by CRLF), задайте git config --global core.autocrlf true. На Linux и macOS обычно ставят значение input. Работать в терминале проще, если уверенно знаете базовые команды Linux, а встроенная панель Git в редакторе описана в статье про настройку VS Code. Остальные материалы по теме собраны по тегу Git.
