Перейти к содержанию

Рабочий процесс

Давайте начнем с обзора всего процесса - от создания проекта в Git до начала отслеживания изменений. Этой теме мы уделим внимание в этом уроке, а в последующих уроках более подробно рассмотрим каждый этап. В ходе обучения мы узнаем множество новых терминов и команд, необходимых для понимания работы с Git.

Установка git

Установка Git отличается в разных операционных системах. Проще всего она выполняется в MacOS и Ubuntu. Они позволяют поставить Git через пакетные менеджеры:

# MacOS
# https://brew.sh/
brew install git

# Ubuntu
sudo apt update # на всякий случай смотрим новые версии
sudo apt install git-all

В Windows для установки Git существует масса вариантов. Основной — через установку Ubuntu on Windows и затем git. Эта настройка может потребовать время, но оно того стоит. Ubuntu on Windows добавляет разработчикам окружение, которое позволяет работать максимально эффективно и удобно. Кроме того, такое окружение очень похоже на среду, в которой будет запускаться код ваших проектов.

В случае если ваш Windows не поддерживает опции, указанные выше, есть несколько альтернативных вариантов:

  1. Самый смелый: установить Ubuntu основной системой. Это очень просто.
  2. Поставить Ubuntu в виртуальную машину. Наиболее безопасный способ, но требует достаточно мощного компьютера.

После установки Git нужно зайти в терминал и проверить, что он работает:

git --version

git version 2.28.0
# Ваша версия может отличаться, но важно, чтобы она была не ниже 2.23.0

Если у вас установилась более старая версия git, и вы работаете в Ubuntu или Ubuntu on Windows, то попробуйте выполнить следующие команды:

sudo apt install software-properties-common
sudo add-apt-repository ppa:git-core/ppa
sudo apt update
sudo apt install git

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

# Выполняется из любой директории
git config --global user.name "<имя фамилия>"
git config --global user.email "<ваш емейл>"

Установка редактора

Для дальнейшей работы понадобится специализированный редактор кода. Мы рекомендуем ставить VSCode. Сейчас это самый популярный (бесплатный!) редактор, обладающий не только широкими возможностями, но и обширной системой плагинов, позволяющих серьезно «прокачать» редактор.

Аккаунт на GitHub

Также для работы понадобится создать аккаунт на GitHub — это бесплатный (для одиночного использования) сервис, в котором хранят свои проекты большинство компаний и разработчиков. Его же используют рекрутеры для поиска сильных программистов. Они смотрят код и оценивают, насколько он популярный и сложный. GitHub-аккаунт с высокой активностью в проектах (своих или чужих) — один из ключевых элементов в трудоустройстве.

После создания аккаунта нужно выполнить еще одну важную операцию — добавления ssh-ключей на github.com. Если по-простому, то ключи позволяют работать репозиториям с GitHub без необходимости постоянно вводить логин и пароль при синхронизации локального и удаленного репозитория (находящегося на GitHub).

Эта задача выполняется в два этапа. Сначала нужно сгенерировать ssh-ключи, а затем один из них (публичный) добавить в настройки GitHub. Подробная инструкция по созданию ssh-ключей доступна на сайте. В двух словах:

# Создание ssh-ключей
ssh-keygen -t ed25519  -C "your_email@example.com"
# Дальше будет несколько вопросов. На все вопросы нужно нажимать Enter.

# Запуск агента ssh, который следит за ключами
eval "$(ssh-agent -s)"

# Добавления нового ssh-ключа в агент
ssh-add ~/.ssh/id_ed25519

Когда ssh-ключи созданы и добавлены в систему, можно приступать к интеграции с GitHub. Подробно эта процедура описана в документации. В двух словах:

  1. Выведите содержимое файла ~/.ssh/id_ed25519.pub и скопируйте его:
cat ~/.ssh/id_ed25519.pub
  1. Добавьте ssh-ключ в аккаунт GitHub. При добавлении вас попросят назвать ключ. Напишите что-нибудь в стиле home.

  2. Проверьте, что подключение работает

ssh -T git@github.com
Hi tirion! You've successfully authenticated, but GitHub does not provide shell access.

Возможные проблемы

Github просит логин и пароль

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/tirion/hexlet-git.git/'

Проверьте, что в репозитории стоит ссылка на SSH url

git remote -v
origin  git@github.com:<username>/<repo>.git (fetch)
origin  git@github.com:<username>/<repo>.git (push)

Если это не так, то ссылку нужно обновить

git remote set-url origin git@github.com:<username>/<repo>.git

Основные команды

Git способен отслеживать файлы проекта только в том случае, если они находятся под контролем версий. Для этого необходимо зайти в директорию проекта и выполнить команду инициализации git init.

Этот подход применим как к новым проектам, так и к уже существующим. Процесс инициализации остается одинаковым в обоих случаях.

# Создаем новый проект
mkdir my-git

# Переходим в созданную директорию
cd my-git

# Выполняем инициализацию
git init

Initialized empty Git repository in /private/tmp/my-git/.git/

Команда git init создает репозиторий, то есть директорию .git, внутри которой находятся все необходимые файлы для работы Git.

Чтобы узнать текущий статус репозитория, используется команда git status.

git status

On branch main
No commits yet
nothing to commit (create/copy files and use "git add" to track)

В этом выводе указано, что репозиторий пустой (No commits yet) — в нем нет новых или измененных файлов.

Давайте попробуем добавить несколько файлов:

# Создаем файл README.md со строкой текста
echo 'Hello, my dear Friend!' > README.md
echo 'Haskell Curry' > PEOPLE.md

Теперь снова смотрим на статус:

git status

# Часть вывода убрана
Untracked files:
  (use "git add <file>..." to include in what will be committed)
    PEOPLE.md
    README.md

Git обнаружил появление новых файлов в проекте, о которых ему ничего не известно. Они отмечаются как неотслеживаемые файлы (untracked files).

Поскольку эти файлы не были добавлены в репозиторий, Git не отслеживает изменения в них.

Добавление файлов в репозиторий происходит в два этапа. На первом этапе выполняется команда подготовки файлов с помощью git add <путь до файла>:

# Для каждого нового или измененного файла
git add README.md

Смотрим, что произошло:

git status

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
    new file:   README.md

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

Файл README.md теперь находится в состоянии «подготовлен к коммиту» — другими словами, файл попал в индекс.

Следующий шаг — это коммит. Под этим термином понимается окончательное добавление в репозиторий, когда Git запоминает файл навсегда и следит за всеми последующими изменениями.

Во время коммита мы берем все подготовленные изменения (они могут включать любое количество файлов) и отправляем их в репозиторий как единое целое. Вот, как он выполняется:

git commit -m 'add README.md'

[main (root-commit) 3c5d976] add README.md
1 file changed, 1 insertion(+)
create mode 100644 README.md

Флаг -m означает message, то есть описание коммита. Коммит можно выполнять и без него, но тогда откроется редактор, в котором нужно будет ввести описание коммита.

Мы рекомендуем делать осмысленные описания — это хороший тон. Пример соглашения по именованию коммитов приведен в дополнительных материалах к уроку.

Процесс Git

Может возникнуть вопрос: зачем так сложно? Зачем отдельно отправлять файлы в индекс командой git add? Почему нельзя добавлять все измененные файлы сразу в коммит?

Как ни странно, такой процесс создан как раз для удобства программистов. Дело в том, что во время разработки может меняться и добавляться много файлов. Но это не значит, что мы хотим добавить все эти изменения в один коммит.

Со смысловой точки зрения, коммит — это какое-то логически завершенное изменение внутри проекта. Его размер бывает очень разным:

  • Маленьким, если мы исправляем одну опечатку в одном файле
  • Большим, если мы внедряем новую функциональность

Главное в коммите — его атомарность. Другими словами, он должен выполнять ровно одну задачу.

Теперь файл README.md находится внутри репозитория. Убедиться в этом можно, запустив команду git status:

git status

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

Команда git status не выводит файлы, которые добавлены в репозиторий и не содержат изменений. При этом сам файл README.md находится внутри директории my-git.

Дополнительные материалы


Самостоятельная работа

  1. Установите Git
  2. Выполните все шаги из урока
  3. Добавьте файл PEOPLE.md в репозиторий

После добавления команда git status покажет такой вывод:

git status

On branch main
nothing to commit, working tree clean