Bezdepbonusu7Программирование: статьи и ответы

Git на практике

Основные команды Git: шпаргалка с примерами

Редакция Bezdepbonusu78 мин чтения

Основные команды Git, которые нужны каждый день, собраны здесь по задачам: от git init до отмены коммита и разрешения конфликтов. К каждой команде есть пример, а опасные операции помечены отдельно.

Схема ветвления и основные команды Git в системе контроля версий
Фото: 😂, Public domain, Wikimedia Commons
Содержание
  1. Установка и настройка
  2. Базовый цикл
  3. История и diff
  4. Ветки
  5. Удаленный репозиторий
  6. Отмена изменений
  7. Stash и теги
  8. Частые ошибки
  9. Частые вопросы

Установка 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) - промежуточная зона, куда вы складываете то, что войдет в следующий коммит. Благодаря ей можно сохранить только часть правок.

  1. Создать репозиторий. В папке проекта выполните git init. Появится скрытая папка .git с историей.
  2. Посмотреть состояние. git status покажет новые, измененные и добавленные в индекс файлы. Короткий вид дает git status -s.
  3. Добавить изменения. git add main.py добавит один файл, git add . - все из текущей папки, git add -p позволит выбрать отдельные куски кода.
  4. Зафиксировать. git commit -m "Добавил парсер CSV" создаст коммит с сообщением.
  5. Проверить историю. 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
Перенести коммиты поверх maingit rebase main

Как разрешить конфликт слияния

Конфликт возникает, когда две ветки поменяли одни и те же строки. Git остановит слияние и отметит спорные места маркерами:

<<<<<<< HEAD
print("Привет")
=======
print("Hello")
>>>>>>> feature/login
  1. Откройте файл и оставьте нужный вариант (или объедините оба), удалив маркеры.
  2. Выполните git add app.py, чтобы пометить конфликт решенным.
  3. Завершите слияние командой git commit (при rebase - git rebase --continue).
  4. Если запутались, откатитесь к состоянию до слияния: 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.

Частые вопросы

Чем git pull отличается от git fetch?

git fetch скачивает новые коммиты с сервера, но не меняет ваши файлы и текущую ветку. git pull делает то же самое и сразу сливает изменения в текущую ветку. Если хотите сначала посмотреть, что пришло, используйте fetch.

Как отменить последний коммит в Git?

Если коммит еще не отправлен, выполните git reset --soft HEAD~1: коммит исчезнет, а изменения останутся в индексе. Если коммит уже на сервере, используйте git revert с его хешем, чтобы не переписывать общую историю.

Чем git switch отличается от git checkout?

git checkout умеет и переключать ветки, и восстанавливать файлы, из-за чего его легко применить не так. В Git 2.23 эти задачи разделили на git switch и git restore. checkout по-прежнему работает, выбор дело привычки.

Как посмотреть, какие файлы изменены?

Команда git status покажет измененные, новые и добавленные в индекс файлы. Сами изменения построчно выводит git diff, а то, что уже подготовлено к коммиту, показывает git diff --staged.

Как удалить ветку локально и на сервере?

Локально: git branch -d имя_ветки (или -D, если ветка не слита). На сервере: git push origin --delete имя_ветки.

Источники

  • Git Reference, git-scm.com, 2026
  • Pro Git book, Scott Chacon, Ben Straub / git-scm.com, 2014
  • Install Git for Windows, git-scm.com, 2026

GitLinux

Похожие материалы

Версии программ и команды проверены на дату публикации. Если что-то изменилось, сверяйтесь с официальной документацией. Нашли неточность? Напишите на admin@bezdepbonusu7.win.