Основы работы с Git

Основные понятия

Что такое Git?

Git (произносится «гит») — распределённая система управления версиями.

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

Что такое "репозиторий"?

Репозиторий Git — это все файлы, находящиеся под контролем версий, вместе с историей их изменения и другой служебной информацией.

По сути это просто папка с файлами.

Репозитории бывают разными...

  • Локальный — храниться на компьютере пользователя.
  • Удалённый — храниться на сервере или в облачном хранилище.
  • Распределённый — каждый пользователь хранит на своём устройстве весь репозиторий целиком, и по мере изменения репозитории синхронизируются.

Что такое "коммит"?

Коммит в Git — это команда, которая фиксирует изменения в репозитории.

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

Установка Git

Проверка наличия Git в системе

Git не входит в стандартный набор программ Windows и macOS.

Чтобы проверить его наличие, введите в «Терминале» команду:

git --version

Если Git установлен, вы увидете номер доступной версии. В противном случае вы увидете сообщение "Unsupported command: git".

Установка в Windows

Скачайте установщик с git-scm.com

Во время установки оставляйте настройки по умолчанию. Убедитесь, что у вас отмечены следующие пункты:

  • Use Git Bash as default shell — выберите программу Git Bash
  • Integrate Git with the Windows Shell — согласитесь работать с Git через командную строку

Установка в Linux

Перейдите на git-scm.com и скопируйте в «Терминал» команду для менеджера пакетов вашего Linux-дистрибутива. Вот некоторые варианты:

# Для Debian/Ubuntu 
apt-get install git

# Для Fedora 
yum install git

# Для OpenSUSE
zypper install git

Настройка Git и создание репозитория

Запуск терминала

Если у вас Linux, то после установки Git запустите «Терминал».

Если Windows — Git Bash.

Регистрация личных данных

Каждое ваше изменение в репозитории будет подписано введённым ником и email-адресом.

Ник нужно писать латиницей, через пробел, в кавычках:

git config --global  user.name "Name Surname"

Почту записываем в кавычках:

git config --global  user.email "your@email"

Настройка цветов

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

git config --global color.ui auto

Проверка настроек

Осталось убедиться, что данные добавлены и корректно отображаются:

git config --list

В ответ на запрос командная строка выведет настройки вашего профиля.

Создание репозитория

Переместитесь в папку с проектом и подключите Git:

cd /папка/с/проектом/
git init

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

На одном компьютере может быть одновременно неограниченное количество репозиториев.

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

  • pwd — просмотр текущего местоположения
  • ls — список папок и файлов в текущей папке
  • ls -a — список папок и файлов текущей папке, включая скрытые
  • cd ~ — переход в папку пользователя
  • cd .. — переход в родительскую папку
  • cd folder_name — переход в выбранную папку
  • mkdir folder_name — создать папку с указанным именем

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

Индекс файлов

Если создать в проекте файл, то Git его посчитает неотслеживаемым (untracked).

Такие файлы нельзя перенести в репозиторий без предварительного добавления в индекс.

Индекс - это промежуточная зона перед репозиторием.

После попадания в индекс файлы становятся подготовленными к коммиту (staged).

Добавление файлов в индекс

# Добавляем в индекс один файл
git add имя_файла
# Добавляем в индекс несколько файлов 
git add имя_файла_1 имя_файла_2 имя_файла_3
# Добавляем в индекс все изменённые файлы 
git add .
# Добавляем в индекс все изменённые файлы с расширением .js
git add *.js

Чтобы получить подробную документацию о какой-либо команде — вызывайте справку:

git help имя_команды

Проверка статуса репозитория

git status

Эта команда показывает текущее состояние репозитория:

  • какие неотслеживаемые файлы попали в проект
  • какие файлы находятся в индексе
  • какие сохранённые файлы вы изменили в репозитории

Пример проверки статуса репозитория

# Запрашиваем текущее состояние репозитория
git status   
# Видим файлы, которые находятся в индексе и подготовлены для коммита
Changes to be committed:
  (use "git restore --staged file..." to unstage)
        modified:   index.html
        modified:   styles.css
# Видим неотслеживаемые файлы, которые только попали в проект
Untracked files:
  (use "git add file..." to include in what will be committed)
        script.js   # Файл script.js не отслеживается Git
# Видим изменённые файлы репозитория, которые ещё не добавлены в индекс 
Changes not staged for commit:
  (use "git add file..." to update what will be committed)
  (use "git restore file..." to discard changes in working directory)
        README.md   # Файл README.md был изменён, но не добавлен в индекс

Добавление файлов в репозиторий

Когда все файлы подготовлены к сохранению, их можно перенести из индекса в репозиторий.

git commit -m "Сообщение"

Сообщения обязательны — по ним разработчики ориентируются в проекте.

Правила добавления комментариев

Из сообщения коммита должно было понятно, какие изменения произошли.

Плохие примеры: "Добавил свой первый коммит.", "Работал над файлом index.html"

Хорошие примеры: "Исправил баг №ХХХХХ", "Сверстал header для главной страницы"

Повторный коммит, минуя индекс

Если вы закоммитили файл и затем снова его изменяете, можно делать новый коммит, минуя индекс. Для этого необходима опция -a:

git commit -am "Сообщение"

Исправление последнего сообщения

Если вы ошиблись в сообщении коммит перезаписать сообщение последнего коммита:

git commit --amend -m "Новое_сообщение"

Просмотр журнала коммитов

Команда git log показывает историю коммитов в обратном хронологическом порядке. Вы можете посмотреть хеш, сообщение, дату и ник автора коммита.

git log   # Запрос на просмотр журнала коммитов

Пример журнала коммитов

git log
# Информация о третьем сделанном коммите
commit 3f6f9e1f58e30e0d3a0d0ab764c0b30a5b621d4a   # Хеш первого коммита
Author: John Doe johndoe@example.com   # Автор первого коммита
Date:   Thu Apr 21 10:26:52 2024 +0300   # Дата первого коммита
    Update README.md   # Сообщение первого коммита

# Информация о втором сделанном коммите
commit acd1e81729dc2ee2dc107ba345fa1ab7e6cfbff9
Author: Jane Smith janesmith@example.com
Date:   Wed Apr 20 16:45:39 2024 +0300
    Add new feature

# Информация о первом сделанном коммите
commit 7df1e8c33b0a617b3a72c785a67e45d0d932a180
Author: John Doe johndoe@example.com
Date:   Mon Apr 18 09:12:21 2024 +0300
    Initial commit

Сокращённый просмотр журнала коммитов

Информацию о каждом коммите можно отобразить сокращённо, в одну строку:

git log --oneline   # Запрос на вывод истории коммитов в одну строку
3f6f9e1 Update README.md
acd1e81 Add new feature
7df1e8c Initial commit

Просмотр отдельного коммита

git show abc12345  # Запрос на просмотр коммита с хешем abc12345

# Метаданные
commit abc12345  # Хеш коммита
Author: John Doe johndoe@example.com  # Автор коммита
Date:   Thu Apr 21 10:26:52 2024 +0300  # Дата и время коммита
    Update README.md  # Сообщение коммита

# Список изменений в файле README.md
    diff --git a/README.md b/README.md
    index abcdef1..1234567 100644
    --- a/README.md
    +++ b/README.md
    @@ -1,3 +1,3 @@
    -# My Project  # Старое содержимое строки
    +# My Awesome Project  # Новое содержимое строки

Если ввести git show без хеша, то выведется содержимое последнего коммита.

Просмотр изменений до коммита

Команда git diff показывает разницу между последним коммитом и текущим состоянием репозитория:

# Смотрим разницу между последним коммитом и текущим состоянием репозитория
git diff

# Разница между последним коммитом и текущим состоянием файла 
git diff file_name

# Разница между последним коммитом и коммитом с указанным хешем 
git diff commit_hash

# Разница между последним коммитом и отслеживаемым состоянием репозитория 
git diff --staged

СПАСИБО ЗА ВНИМАНИЕ!