Код
#статьи

Основные команды для работы с Git и GitHub

Коммитим, логируем, пушим, мёржим — шпаргалка с примерами и практикой.

Иллюстрация: Катя Павловская для Skillbox Media

В этой статье мы собрали команды Git для самых разных задач: от настройки локального репозитория до работы с ветками и взаимодействия с GitHub.

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

Содержание

Эксперт

Константин Шибков

Senior Java-разработчик в компании CDEK.

Эксперт Skillbox, в прошлом работал над программой курса по Java, был программным директором.

Установка и настройка

Git не входит в стандартный набор программ Windows и macOS. В Linux он встречается, однако не во всех дистрибутивах. Чтобы проверить его наличие, введите в «Терминале» команду:

git --version

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

Установка

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

Windows. Скачайте установщик с git-scm.com. На сайте есть три версии:

  • стандартная 32-разрядная версия с последней сборкой;
  • автономная версия для установки Git без подключения к интернету;
  • портативный установщик для загрузки на флешку.

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

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

Также Git на Windows можно установить через менеджер пакетов winget от Microsoft. Для этого откройте оболочку PowerShell и введите команду:

winget install --id Git.Git -e --source winget

macOS. В программе «Терминал» установите менеджер пакетов Homebrew:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

После этого выполните команду:

$ brew install git

Другие способы установки Git на macOS описаны на сайте git-scm.com.

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

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

# Для Fedora 
yum install git

# Для OpenSUSE
zypper install git

Настройка

Если у вас macOS или 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:

git init

После исполнения команды появится сообщение об инициализации репозитория. Оно означает, что Git начал отслеживать файлы проекта и будет записывать изменения в скрытую папку .git. Если вам понадобится инициализировать новый репозиторий — повторите процедуру. На одном компьютере Git может одновременно управлять неограниченным количеством репозиториев.

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

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

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

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


git add: добавление файлов в индекс

Если вы создадите в проекте файл, то Git его посчитает неотслеживаемым (untracked). Такие файлы нельзя перенести в репозиторий без подготовки к сохранению. За подготовку отвечает индекс — промежуточная зона перед репозиторием. Перенести файлы в индекс можно с помощью команды git add.

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

# Добавляем в индекс один файл
git add file_name
# Добавляем в индекс несколько файлов 
git add file_name_1 file_name_2 file_name_3
# Добавляем в индекс все изменённые файлы 
git add .

У команды git add есть ещё множество вариаций. Например, git add *.js перенесёт в индекс все файлы из текущей папки с расширением .js. Чтобы получить подробную документацию о какой-то команде — вызывайте справку:

git help command_name

git status: проверка статуса репозитория

Команда 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: добавление файлов в репозиторий

Когда все файлы подготовлены к сохранению, их можно перенести из индекса в репозиторий. Для этого нужна команда git commit с опцией -m и сообщением коммита. Сообщение пишется в кавычках и обычно латиницей:

git commit -m "Commit message"

Сообщения обязательны — по ним разработчики ориентируются в проекте. Есть даже специальный документ — «Соглашение о коммитах». В нём разработчики договорились, как правильно добавлять комментарии. Суть в том, чтобы из сообщения коммита было понятно, какие изменения произошли. Вот примеры:

❌ Добавил свой первый коммит.

✅ Исправил баг №ХХХХХ.

❌ Работал над файлом index.html.

Сверстал header для главной страницы.

Если убрать опцию -m, то после нажатия Enter вы попадёте в текстовый редактор. Там вам нужно будет написать сообщение, сохранить его и выйти. А в Vim это нереально 😆

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

git commit -am "Commit message"

Другая частая ситуация: вы торопились и ошиблись в сообщении коммита. Можно ввести опцию --amend и перезаписать сообщение последнего коммита:

git commit --amend -m "New commit message"

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 множество опций, от которых будет зависеть отображение журнала. Например, можно в одну строку расположить информацию о каждом коммите. Для этого придётся убрать дату, ник автора и сократить размер хеша:

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

git show: просмотр коммита

Команда git show выводит информацию об одном коммите. Сообщение делится на два блока: часть с метаданными и список изменений, внесённых в коммит.

$ 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 показывает разницу между последним коммитом и текущим состоянием репозитория. То есть последний коммит сравнивается со всеми неотслеживаемыми файлами, которые ещё не переведены в индекс.

Можно добавить имя файла и сравнить его содержимое с последним коммитом.

Ещё вариант: вместо имени файла можно использовать хеш коммита. Также можно добавить опцию --staged и сравнить версию кода после последнего коммита с отслеживаемым состоянием репозитория — со всеми файлами, которые находятся в индексе.

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

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

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

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

git difftool: запуск внешнего инструмента сравнения файлов

Команда git difftool работает по принципу команды git diff — сравнивает файлы и находит в них различия. Только git diff отображает результат в текстовом виде, а git difftool в графическом: команда запускает внешние программы с визуальными инструментами сравнения файлов. Если хотите попробовать — установите Beyond Compare, vimdiff, Meld или другое похожее приложение. После прочтите документацию по git difftool и попрактикуйтесь отображать данные.

git restore: отмена изменений

Команда git restore возвращает файл к состоянию последнего коммита. Она отменяет все изменения, если файл не перенесён в индекс. Если файл попал в индекс, то вместе с названием команды нужно использовать опцию --staged.

# Вернуть неотслеживаемый файл к состоянию последнего коммита 
git restore file_name

# Вернуть все файлы из индекса к состоянию последнего коммита
git restore --staged 

# Вернуть указанный файл из индекса к состоянию последнего коммита
git restore --staged file_name

git rm: удаление файлов из индекса

Команда git rm позволяет удалить файл, который по ошибке попал в индекс. После выполнения команды файл пропадёт из индекса и из папки на вашем компьютере, в которой хранится проект. Если вы хотите удалить файл только из индекса, то команду git rm нужно использовать вместе с опцией --cached.

# Удалить файл из индекса и рабочей директории
git rm file_name

# Удалить файл из индекса и оставить в папке на компьютере 
git rm --cached file_name

git reset: откат коммита

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

На выбор можно использовать три режима: --soft, --mixed и --hard.

В режиме --soft проект откатывается к указанному коммиту и переводит все последующие коммиты в индекс. Вы можете сразу сделать новый коммит и перезаписать историю проекта, оставив исходные файлы без изменений.

В режиме --mixed откаченные файлы попадают в неотслеживаемую зону. Вы можете эти файлы изменить, удалить или вернуть обратно в индекс.

В режиме --hard проект откатывается к указанному коммиту и удаляет все последующие коммиты без возможности их восстановления.

# Откатываемся и переводим последующие коммиты в индекс
git reset --soft commit_hash

# Откатываемся и переводим последующие коммиты в неотслеживаемую зону
git reset --mixed commit_hash

# Откатываемся и удаляем все последующие коммиты
git reset --hard commit_hash

Перед выполнением git reset мы рекомендуем всегда делать резервную копию проекта, на случай непредвиденного удаления файлов.

Ветвление

Вся разработка в Git происходит в ветках. Они сохраняют коммиты и организуют их в цепочку: перемещаясь по ветке от одного коммита к другому можно отследить изменения в проекте. При работе с ветками вы будете часто их создавать, просматривать, переименовывать, переключать, объединять и удалять.


git branch <branch_name>: создание новой ветки

После первого коммита Git автоматически создаёт первую ветку. Обычно в ней хранят стабильную версию проекта для пользователей продукта. Под остальные задачи разработчики создают отдельные ветки с помощью команды git branch:

git branch branch_name

По названию ветки должно быть понятно, что в ней происходит. Например, если в названии упоминается слово bugfix, то ветка предназначена для исправления ошибок. Слово feature указывает на разработку какой-то функции. А вот случайное название test10.24 не значит ничего, и таких названий лучше избегать.

Ветку с неудачным названием можно переименовать:

git branch -m old_branch_name new_branch_name

# old_branch_name — старое имя ветки 
# new_branch_name — новое имя ветки

git branch: просмотр веток

Команда git branch позволяет получить список всех доступных веток в проекте. Также она проставляет символ звёздочки слева от текущей активной ветки:

# Запрашиваем список всех доступных веток 
git branch

# Результат вывода
  bugfix/fix-bug
  * maine
  feature/new-feature

git checkout: переключение между ветками

Команда git checkout позволяет переключиться с одной ветки на другую:

git checkout branch_name

Также можно одной командой создать новую ветку и сразу в неё перейти:

git checkout -b branch_name

У команды git checkout есть более современная альтернатива:

git switch branch_name

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

git merge: слияние репозиториев

Команда git merge позволяет добавить изменения из одной ветки в другую. Такой процесс называется слиянием, и он завершается появлением общего коммита для объединённых веток. По этому коммиту можно отследить историю каждой ветки.

# Переключаемся на основную ветку, которая будет принимать изменения 
git checkout main_branch

# Сливаем изменения из второстепенной ветки в основную 
git merge secondary_branch

git branch -d <branch_name>: удаление ветки

После слияния второстепенная ветка больше не нужна и мы её можем удалить.

# Проверяем текущую ветку
git branch

# Результат вывода
  main_branch
  * secondary_branch

# Переключаемся на основную ветку
git checkout main_branch

# Удаляем второстепенную ветку
git branch -d secondary_branch

Удалённый репозиторий

В предыдущих разделах мы использовали Git локально на компьютере. Теперь нам нужна удалённая версия репозитория, которой мы сможем поделиться с другими разработчиками или использовать в качестве резервного хранилища для проекта. Создать удалённый репозиторий можно на разных платформах, среди которых популярны сервисы GitHub и GitLab. Мы будем работать с GitHub.

Для работы с GitHub вам нужно зарегистрироваться и настроить SSH-ключи для безопасного соединения. После можно переходить к удалённому репозиторию.


git remote add origin url: привязка локального и удалённого репозитория

С помощью командной строки переместитесь в папку с проектом на своём компьютере. Теперь вы можете выполнить команду git remote add, которая установит связь между вашим локальным и удалённым репозиторием на GitHub.

К команде нужно добавить два параметра: имя вашего удалённого репозитория и его адрес. Адрес вы найдёте на странице своего профиля во вкладке SSH.

# Перемещение в папку с проектом
cd путь/к/папке/с/проектом

# Привязка локального репозитория к удалённому на GitHub
git remote add origin git@github.com:ваш_профиль/ваш_репозиторий.git

git remote: просмотр удалённых репозиториев

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

# Запрашиваем список удалённых репозиториев, которые связаны с локальным
git remote

# Пример вывода: два удалённых репозитория связаны с нашим локальным
  origin
  upstream

git remote — v: просмотр удалённых URL-адресов

Команда git remote показывает только названия удалённых репозиториев, которые связаны с вашим локальным. К команде можно добавить опцию -v и посмотреть удалённые URL-адреса. По URL-адресам будет видно, какие изменения вы делали.

# Запрос списка удалённых репозиториев с URL-адресами
git remote -v

# Пример вывода с URL-адресами
  origin  https://github.com/user/repo.git (fetch)
  origin  https://github.com/user/repo.git (push)
  upstream  https://github.com/otheruser/repo.git (fetch)
  upstream  https://github.com/otheruser/repo.git (push)

git push: отправка изменений в удалённый репозиторий

Команда git push загружает изменения из локального репозитория в удалённый.

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

# Команда для первой загрузки изменений в удалённый репозиторий: текущая ветка будет связана с веткой main в удалённом репозитории origin 
git push -u origin main

# Команда для второй и последующих загрузок изменений в удалённый репозиторий 
git push

git pull: получение изменений из удалённого репозитория

Команда git pull скачивает изменения из удалённого репозитория в локальный.

# Скачиваем изменения из удалённого репозитория и добавляем их в локальную ветку
git pull

Практика по основным командам Git

Попрактиковаться можно вместе с экспертами Skillbox.

Даниил Пилипенко, CEO центра подбора IT-специалистов SymbioWay, провёл вебинар по работе с системой управления версиями Git и её основным командам: git status, git add, git commit, git log, git branch, git clone и другим.

Вебинар Skillbox: основные команды для работы с Git и GitHub

Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!


Запишите ребёнка на бесплатный урок в Skillbox Kids ➞
Учим детей программированию, веб-дизайну и разработке игр. Преподаватель — IT-эксперт — подберёт курс по интересам ребёнка. Подробности — по клику.
Узнать больше
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована