База для программиста, часть 4: Git для начинающих — зачем он нужен с первого дня и какие команды знать

База для программиста, часть 4: Git для начинающих — зачем он нужен с первого дня и какие команды знать

Git — это система контроля версий: программа, которая запоминает каждое сохранённое состояние вашего проекта и позволяет вернуться к любому из них. Без неё история проекта превращается в папку с файлами вроде проект_финал_v2_новый.zip. С Git у вас есть чистая история изменений, возможность безопасно экспериментировать и способ работать в команде. Ниже разберём главные понятия и пройдём весь путь на живом примере: от первого коммита до слияния веток.

Это четвёртая часть серии «База для программиста». В части 3 мы освоили терминал, он понадобится здесь: с Git работают именно через него.

Зачем Git нужен даже в учебном проекте

Многие новички откладывают Git «на потом, когда будет настоящая работа». На практике он полезен с первого дня по трём причинам.

  1. История изменений. Сломали программу и не помните, что меняли? Git покажет, что именно изменилось с последнего рабочего состояния, и позволит вернуться к нему.
  2. Безопасные эксперименты. Новую идею можно проверить в отдельной ветке и не бояться испортить рабочий код. Не получилось — ветку просто удаляют.
  3. Привычка, которую ждут работодатели. Git используют практически во всех командах разработки, а ссылка на репозиторий с учебными проектами — стандартная часть резюме джуниора.

Git и GitHub: в чём разница

Это самая частая путаница в начале.

  • Git — программа, которая работает на вашем компьютере и хранит историю проекта локально. Для работы ей не нужен интернет.
  • GitHub (а также GitLab, Bitbucket) — сайты-сервисы, где можно хранить копию репозитория в интернете, делиться кодом и работать над ним вместе.

Проще всего так: Git — это «история изменений», GitHub — «облако для этой истории». Использовать Git можно без GitHub, а вот GitHub без Git не обойдётся.

Три главных понятия: репозиторий, коммит, ветка

  • Репозиторий — папка проекта, за которой следит Git. Внутри неё появляется скрытая папка .git, где хранится вся история.
  • Коммит — сохранённый снимок проекта с коротким описанием. Это точка, к которой можно вернуться. У каждого коммита есть идентификатор, например 5bd6657.
  • Ветка — отдельная линия истории. Основная ветка обычно называется main (в старых проектах master). От неё можно ответвиться, поработать над идеей и потом слить результат обратно.

Установка и первая настройка

Проверьте, есть ли Git на компьютере:

git --version

Если команда не найдена, установите его:

  • Windows: скачайте установщик с сайта git-scm.com.
  • macOS: выполните git --version в терминале, система сама предложит установить инструменты разработчика. Другой вариант — brew install git.
  • Linux (Ubuntu, Debian): sudo apt install git.

Один раз представьтесь, чтобы Git подписывал ваши коммиты:

git config --global user.name "Анна Иванова"
git config --global user.email "anna@example.com"

Как устроена работа с Git: три зоны

Чтобы понимать команды, запомните схему. Изменения в файлах проходят три зоны:

  1. Рабочая папка — ваши файлы в том виде, в каком вы их правите.
  2. Индекс (staging area) — «корзина» для коммита: сюда вы кладёте только те изменения, которые хотите сохранить. Команда git add.
  3. Репозиторий — готовая история. Сюда изменения попадают командой git commit.

Такое разделение позволяет собрать в один коммит именно то, что относится к одной задаче, даже если вы успели поправить в проекте и другие вещи.

Практика: первый репозиторий и первые коммиты

Все команды ниже я выполнил в Git версии 2.43, и выводы взяты из реального запуска. Название ветки по умолчанию зависит от настроек: если у вас вместо main показывается master, всё работает так же.

Создайте папку и репозиторий:

mkdir git-practice
cd git-practice
git init -b main

Git ответит:

Initialized empty Git repository in /home/anna/git-practice/.git/

(Путь у вас будет свой.) Создайте файл и посмотрите состояние:

echo "Привет, Git!" > hello.txt
git status
On branch main

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
    hello.txt

nothing added to commit but untracked files present (use "git add" to track)

Git говорит: файл hello.txt есть, но он «неотслеживаемый». Добавьте его в индекс и сделайте первый коммит:

git add hello.txt
git commit -m "Добавить hello.txt"
[main (root-commit) 2fa4a0e] Добавить hello.txt
 1 file changed, 1 insertion(+)
 create mode 100644 hello.txt

Теперь допишите в файл вторую строку и посмотрите, что изменилось:

echo "Вторая строка" >> hello.txt
git diff
diff --git a/hello.txt b/hello.txt
index bf1302d..8d55612 100644
--- a/hello.txt
+++ b/hello.txt
@@ -1 +1,2 @@
 Привет, Git!
+Вторая строка

Строка с плюсом — добавленная. Сохраните изменение вторым коммитом и посмотрите историю:

git commit -am "Добавить вторую строку"
git log --oneline
5bd6657 Добавить вторую строку
2fa4a0e Добавить hello.txt

Флаг -a в git commit -am автоматически добавляет в коммит все изменения в уже отслеживаемых файлах. Для новых файлов по-прежнему нужен git add.

Терминал с выводом Git: два коммита, ветка и слияние

Ветки: как экспериментировать без страха

Допустим, вы хотите попробовать рискованную идею. Создайте для неё ветку и сразу перейдите в неё:

git switch -c eksperiment
Switched to a new branch 'eksperiment'

Внесите правку и сохраните её коммитом, затем вернитесь в основную ветку и слейте результат:

echo "Рискованная правка" >> hello.txt
git commit -am "Эксперимент"
git switch main
git merge eksperiment
[eksperiment c6ea990] Эксперимент
 1 file changed, 1 insertion(+)
Switched to branch 'main'
Updating 5bd6657..c6ea990
Fast-forward
 hello.txt | 1 +
 1 file changed, 1 insertion(+)

Слово Fast-forward значит, что в main за это время ничего нового не появилось, и Git просто «перемотал» её вперёд до последнего коммита ветки.

Схема: ветка eksperiment до и после слияния с main

Если эксперимент не удался, ветку можно удалить командой git branch -d eksperiment (или -D, если она не была слита), и основная история останется нетронутой.

Если же в двух ветках изменили одну и ту же строку, при слиянии возникнет конфликт. Это нормальная ситуация, не ошибка: Git отметит спорные места в файле, а вы решите, какой вариант оставить, и завершите слияние коммитом. Подробно конфликты мы разбирать не будем, но знать, что они бывают и их можно исправить, полезно заранее.

Как отменить изменения

Это самое частое, ради чего новичку нужен Git.

Ситуация Команда Что делает
Хочу посмотреть, что изменилось git diff Показывает правки, которые ещё не в индексе
Убрал файл из индекса по ошибке git restore --staged файл Возвращает файл из индекса в рабочую папку, правки остаются
Хочу выбросить правки в файле git restore файл Возвращает файл к состоянию последнего коммита. Несохранённые правки пропадут безвозвратно
Хочу отменить уже сделанный коммит git revert идентификатор Создаёт новый коммит, который отменяет указанный. История не переписывается
Хочу вернуться посмотреть старое состояние git switch --detach идентификатор Временно переходит на старый коммит, вернуться можно через git switch main

Коммит — это страховка: то, что закоммичено, найти и вернуть почти всегда можно. А вот то, что не было закоммичено, git restore удалит без возможности восстановления.

Что не нужно хранить в Git

  • Пароли, ключи API, токены. Если секрет попал в историю, удалить его оттуда сложно, а если репозиторий публичный, ключ нужно считать скомпрометированным.
  • Тяжёлые и временные файлы: папки node_modules, виртуальные окружения Python, скомпилированные файлы, архивы.

Чтобы Git игнорировал такие файлы, создайте в корне проекта файл .gitignore и перечислите в нём имена и маски, например:

node_modules/
.env
*.log

Типичные ошибки новичков

  • Коммит «fix» или «правки». Через неделю по такой истории ничего не понять. Пишите, что изменилось и зачем: «Добавить проверку пустого поля формы».
  • Один огромный коммит раз в неделю. Чем меньше и осмысленнее коммиты, тем проще искать причину ошибки и откатывать изменения.
  • Забыли git add. Новый файл не попал в коммит, потому что вы его не добавили. Перед коммитом проверяйте git status.
  • git add . вслепую. Эта команда добавляет в индекс всё подряд, включая файлы с секретами. Сначала посмотрите git status.
  • Работа прямо в main. Для учебных проектов терпимо, для командной работы нет. Привыкайте создавать ветку под каждую задачу.
  • Застряли в текстовом редакторе после git commit без -m. Git открывает редактор (чаще vim или nano), и многие не знают, как из него выйти. В vim нажмите Esc, затем введите :wq и Enter, чтобы сохранить, или :q!, чтобы выйти без сохранения. В nano — Ctrl+O, Enter, затем Ctrl+X.

Мини-упражнение

  1. Создайте папку git-practice, перейдите в неё и выполните git init -b main.
  2. Создайте файл notes.txt с любой строкой и сделайте первый коммит.
  3. Добавьте ещё две строки двумя отдельными коммитами с понятными сообщениями.
  4. Посмотрите историю командой git log --oneline.
  5. Создайте ветку idea, добавьте в ней строку и сделайте коммит.
  6. Вернитесь в main и слейте ветку idea.
  7. Измените файл, не коммитя изменение, и верните его в прежнее состояние командой git restore notes.txt.

Если всё получилось, вы прошли базовый рабочий цикл Git, на котором строится почти вся ежедневная работа разработчика.

Что дальше

Когда с локальным Git всё понятно, следующий шаг — выложить репозиторий на GitHub, но об этом мы подробно поговорим в части про первый pet-проект. Пока же в следующей части серии разберём алгоритмы и структуры данных, которые действительно нужны новичку. <!-- добавить ссылку на часть 5 после публикации -->

Если вы выбираете курс по программированию, программы обучения собраны в каталоге MAXCOURSE. Все части серии доступны по тегу baza-programmista.

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

Нужен ли Git, если я работаю над проектом один?
Да. Он страхует от потери работы, позволяет откатить неудачные правки и хранит историю, по которой видно, как развивался проект.

Чем Git отличается от GitHub?
Git — программа для хранения истории на вашем компьютере, GitHub — сайт, где можно держать удалённую копию репозитория и делиться кодом. Git работает без GitHub, но не наоборот.

Нужно ли запоминать все команды Git?
Нет. На старте хватает около десяти: init, status, add, commit, log, diff, switch, merge, restore, revert. Остальные ищутся в документации по мере необходимости.

Что делать, если я случайно удалил файл?
Если файл был закоммичен, верните его командой git restore имя_файла. Если он никогда не попадал в коммит, Git восстановить его не сможет, поэтому коммитьте чаще.

Можно ли пользоваться Git без терминала?
Можно: есть графические программы (GitHub Desktop, встроенные инструменты VS Code). Но они повторяют те же понятия, поэтому сначала стоит разобраться в командах и схеме работы.


Актуальность: для Git версии 2.43

Р

Автор

Редакция MAXCOURSE

Сравниваем программы онлайн-школ по срокам, цене и формату обучения.

⚖ Сравнение ()