Как начать работать с git
Git — это распределенная система контроля версий, которая помогает разработчикам отслеживать изменения в коде, работать в команде и управлять историей проекта. Она позволяет сохранять разные версии файлов, возвращаться к ним при необходимости и совместно работать над одним проектом без потери данных.
Использование git значительно упрощает работу над сложными проектами, обеспечивает прозрачность изменений и помогает избегать конфликтов при совместной работе.
В этом руководстве рассмотрим основные команды для работы с git без использования графического интерфейса:
- Подготовка к работе.
- Работа с репозиторием.
- Работа с ветками.
- Коммиты.
- Отправка изменений.
- Решение конфликтов.
- Дополнительные команды.
Перед началом работы
Установите git:
- Скачайте git с официального сайта.
- Запустите установочный файл и следуйте указаниям мастера установки.
- В процессе установки выберите опцию интеграции с командной строкой или PowerShell.
В терминале выполните команду:
sudo apt update && \
sudo apt install git
Примечание
Если вы используете дистрибутив, отличный от Ubuntu или Debian, установите git с помощью команд вашего пакетного менеджера.
-
Установите пакетный менеджер Homebrew с помощью команды в терминале:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
-
Установите git:
brew update && \ brew install git
Работа с репозиторием
Инициализация репозитория (git init)
Инициализация нужна для того, чтобы git проиндексировал файлы в директории и начал отслеживать изменения в ней.
-
Создайте директорию для вашего проекта с помощью команды в терминале:
mkdir <путь_к_директории>
Если нужно инициализировать репозиторий в уже существующей директории, пропустите этот шаг.
-
Перейдите в директорию с проектом:
cd <путь_к_директории>
-
Чтобы инициализировать репозиторий, выполните команду:
git init
В текущей директории будут созданы файлы для работы с git, и она начнет восприниматься git в качестве репозитория.
Совет
Также вы можете создать репозиторий в SourceCraft и склонировать себе уже инициализированный репозиторий.
Клонирование существующего репозитория (git clone)
Чтобы клонировать существующий репозиторий, выполните команду:
git clone <ссылка_на_репозиторий>
Будет создана локальная копия удаленного репозитория на вашем компьютере.
Важно
Чтобы склонировать приватный репозиторий, аутентифицируйтесь с помощью персонального токена (PAT) или SSH-ключа.
Обновление локальной копии репозитория (git fetch и git pull)
Чтобы получить изменения из удаленного репозитория, выполните команду:
git fetch
Изменения скачаются во внутреннее хранилище git и будут доступны в удаленных ветках, например origin/main
, но ваши локальные ветки не изменятся.
Чтобы объединить эти изменения с вашей текущей веткой, выполните команду:
git pull
Работа с ветками
Ветки репозитория — это отдельные копии проекта, которые позволяют работать над изменениями независимо от основной версии. Ветки могут быть как локальными, так и удаленными. Локальная ветка находится на вашем компьютере, а удаленная — на сервере и обычно используется для совместной работы.
Основная или главная ветка (main)
В большинстве проектов основная ветка называется main
или master
. В ней обычно хранится стабильная версия проекта — то, что готово к релизу или использованию. Не рекомендуется сразу вносить изменения в основную ветку — лучше создавать отдельные ветки для разработки новых функций или исправлений.
Чтобы посмотреть все локальные ветки, выполните команду:
git branch
Рабочая ветка будет отмечена символом *
.
Совет
Также вы можете посмотреть все ветки репозитория в интерфейсе SourceCraft. Для этого на странице репозитория в разделе
Отколоть ветку (git branch)
Отколоть ветку означает создать независимую копию текущей ветки репозитория, чтобы работать над изменениями отдельно от основной линии. Перед началом работы всегда выполняйте git pull
, чтобы быть уверенным в актуальности ветки и данных в ней.
Чтобы отколоть новую ветку, выполните команду:
git branch <имя_ветки>
Чтобы отколоть ветку и сразу перейти на нее, выполните команду:
git checkout -b <имя_ветки>
Переключение между ветками (git checkout)
Чтобы перейти на другую существующую ветку, выполните команду:
git checkout <имя_ветки>
Объединение веток (git merge)
Объединение (merge) веток используется, чтобы соединить изменения из одной ветки с другой. Например, чтобы внести подготовленные исправления или обновления в основную ветку. Процесс происходит путем слияния содержимого выбранных веток в одну, объединяя все внесенные изменения.
Когда работа в отколотой ветке завершена, чтобы объединить ее с основной, поочередно выполните команды:
-
Переключитесь на целевую ветку, например
main
:git checkout main
-
Выполните слияние:
git merge <имя_ветки_с_изменениями>
Если в процессе объединения возникнут конфликты, их нужно решить вручную.
После успешного слияния ветка, которая «вливалась» в основную, обычно не удаляется автоматически — ее нужно удалить вручную.
Совет
Для безопасного объединения веток с возможностью рецензирования изменений и автоматическими проверками в SourceCraft предусмотрен механизм предложений изменений (pull requests). Подробнее см. Предложить изменения в репозитории SourceCraft.
Удаление ветки (git branch -d)
Если ветка больше не нужна, ее можно удалить командой:
git branch -d <имя_ветки>
Если у вас есть невнесенные изменения в ветке, которые могут быть потеряны при удалении, команда выдаст ошибку. Посмотреть текущие невнесенные изменения можно с помощью команды:
git status
В ответном сообщении будут выведены файлы с изменениями, которые не были добавлены в коммит.
Чтобы принудительно удалить ветку, выполните команду:
git branch -D <имя_ветки>
Важно
При принудительном удалении все изменения, которые не были добавлены в коммит, будут потеряны. Убедитесь, что все важное сохранено.
Дополнительные действия с ветками
Чтобы отправить ветку на сервер, выполните команду:
git push origin <имя_ветки>
Команда отправит вашу локальную ветку в удаленный репозиторий, делая ее доступной для других участников проекта.
Чтобы просмотреть все ветки в репозитории, выполните команду:
git branch -a
Результатом будет список всех веток, доступных в вашем репозитории, включая те, что находятся на сервере.
Чтобы восстановить ранее удаленную ветку, выполните команду:
git checkout -b <имя_новой_ветки> <имя_удаленной_ветки>
Из удаленной ветки будет создана новая ветка. Это позволит восстановить утерянные или ошибочно стертые данные.
Коммиты
После сохранения изменений в файлах репозитория необходимо подготовить их к коммиту.
Коммиты — это «снимки» состояния ваших файлов в определенный момент времени. Они позволяют отслеживать историю изменений и возвращаться к нужным версиям.
Совет
Регулярно делайте коммиты даже после небольших изменений.
Добавление изменения в коммит (git add)
-
Посмотрите изменения, которые еще не были внесены в коммит:
git status
-
Добавьте изменения в коммит одним из следующих способов:
-
Добавить изменения в конкретном файле:
git add <имя_файла>
-
Добавить все измененные файлы в текущей директории:
git add .
-
Добавить все измененные в репозитории файлы:
git add --all
-
Создание коммита с описанием (git commit)
Чтобы создать коммит с описанием внесенных изменений, выполните команду:
git commit -m "Описание изменений"
Совет
Используйте короткие сообщения при коммите — так легче ориентироваться.
Изменение последнего коммита (git commit --amend -m)
Чтобы изменить последний коммит, например, исправить описание изменений, выполните команду:
git commit --amend -m "Обновленное описание"
Объединение коммитов (git rebase)
Объединение нескольких последних коммитов в один помогает сделать их историю более лаконичной или сгруппировать связанные изменения в единый логический блок.
Для этого удобно использовать интерактивное переписывание истории (git rebase -i
), которое позволяет выбрать коммиты для объединения или изменить их порядок и содержание.
Чтобы запустить переписывание истории, выполните команду:
git rebase -i HEAD~N
Где N
— число последних коммитов, которые нужно обработать.
В результате откроется редактор со списком выбранных коммитов. Чтобы объединить последние коммиты с предшествующими, нужно заменить слово pick
на squash
(или s
).
Примечание
При переписывании истории могут возникнуть конфликты, которые потребуется решить вручную, а затем продолжить процесс командой:
git rebase --continue
Пример объединения коммитов
Результат команды git rebase -i HEAD~3
в редакторе:
pick e3a1b35 Исправление опечатки
pick 7ac9a67 Добавление новой функции
pick 4f5d6e2 Обновление документации
Чтобы объединить последние три коммита в один, замените слова pick
на squash
(или s
) у второго и третьего коммита:
pick e3a1b35 Исправление опечатки
squash 7ac9a67 Добавление новой функции
squash 4f5d6e2 Обновление документации
После этого сохраните файл и закройте редактор. Выбранные коммиты объединятся.
Удаление коммитов (git reset)
Чтобы удалить последний коммит, выполните команду:
git reset --hard HEAD~1
Чтобы удалить несколько последних коммитов, выполните команду:
git reset --hard HEAD~N
Где N
— число последних коммитов, которые нужно удалить.
Все изменения, связанные с выбранными коммитами, будут полностью удалены из текущей ветки.
Важно
Будьте осторожны при использовании команды git reset
. Вы можете потерять важные изменения, которые не были сохранены в других ветках или не зафиксированы в другом месте.
Восстановление коммита (git cherry-pick)
Для восстановления ранее удаленного коммита понадобится его хеш (SHA).
Хеш коммита — уникальный короткий код, который создается автоматически для каждого сохраненного изменения в проекте.
Примечание
Коммит, который нужно восстановить, должен находиться в истории репозитория. Если коммит был полностью удален, например при git push --force
, его восстановление невозможно.
-
Чтобы найти нужный коммит, посмотрите журнал ссылок, выполнив команду:
git reflog
Пример результата команды:
abc1234 (HEAD -> master) HEAD@{0}: reset --hard HEAD~1 def5678 (branch: master) HEAD@{1}: commit: Добавлено пояснение ghi9012 HEAD@{2}: commit: Исправлена ошибка
Где:
def5678
— хеш коммита;commit: Добавлено пояснение
— описание коммита.
-
В выводе команды найдите нужный коммит по его описанию.
-
Скопируйте его хеш. Обычно это первые 7–10 символов в начале строки.
-
Выберите один из вариантов восстановления:
В новую веткуВ текущую веткуВернуть текущую ветку к состоянию коммитаЧтобы создать новую ветку на основе коммита и сразу переключиться на нее, выполните команду:
git checkout -b <имя_новой_ветки> <хеш_коммита>
Пример:
git checkout -b restored-branch def5678
В процессе восстановления могут возникнуть конфликты, которые потребуется решить вручную.
Коммит будет добавлен в текущую рабочую ветку как последний. Изменения, сохраненные в нем, будут включены в ее историю, не затрагивая другие текущие изменения. В процессе добавления могут возникнуть конфликты, которые потребуется решить вручную перед завершением операции.
Чтобы восстановить коммит в рабочей ветке, выполните команду:
git cherry-pick <хеш_коммита>
Удаленный коммит будет возвращен на свое место в истории. Ветка перейдет к состоянию этого коммита, игнорируя все изменения, сделанные позже. Будьте осторожны, так как все текущие несохраненные изменения будут удалены.
Чтобы сделать этот коммит текущим состоянием ветки, выполните команду:
git reset --hard <хеш_коммита>
Просмотр коммита (git show)
Просмотр коммита происходит вне какой-либо ветки. Чтобы посмотреть содержимое коммита прямо в терминале, выполните команду:
git show <хеш_коммита>
Чтобы выйти из режима просмотра, нажмите q
на клавиатуре.
Отправка изменений
Push — это команда, которая отправляет ваши изменения с компьютера на сервер, чтобы другие участники проекта могли их увидеть и использовать.
Отправить изменения (git push)
Чтобы отправить текущие изменения в удаленный репозиторий, выполните команду:
git push origin <имя_ветки_в_удаленном_репозитории>
Отменить отправку изменений (git reset и git push)
Чтобы отменить ваши последние изменения на сервере и вернуть ветку к предыдущему состоянию, выполните следующие шаги:
-
Верните локальную ветку к состоянию перед последним коммитом. Для этого выполните команду, которая удалит последний коммит и восстановит файлы до предыдущего состояния:
git reset --hard HEAD^
-
Обновите удаленную ветку, чтобы она соответствовала текущему состоянию локальной. Для этого выполните команду принудительной отправки изменений:
git push --force
Будьте осторожны, так как использование параметра
--force
может привести к потере данных у других участников проекта, если они уже синхронизировались с удаленным репозиторием. Изменения, внесенные ими после синхронизации, также будут стерты. Перед выполнением рекомендуется предупредить команду или убедиться, что никто не потеряет важную информацию.Примечание
Если ваши изменения еще не внесены в коммит — сначала сделайте
commit
, затемpush
.
Решение конфликтов
Конфликт — это ситуация, когда в репозитории есть противоречивые изменения, сделанные в одних и тех же местах.
Причины возникновения конфликтов:
- Одновременная работа нескольких людей над одними файлами.
- Обновление локальной копии с сервера (
git pull
), когда изменения в удаленном репозитории противоречат вашим локальным правкам. - Слияние веток (
git merge
), если в них были сделаны разные изменения в одних и тех же участках кода. - Попытка отправки изменений (
git push
) в удаленный репозиторий, если в нем уже есть коммиты, противоречащие вашим локальным правкам.
Git сообщит о конфликте и покажет файлы с метками конфликтов.
Что делать при конфликте:
-
Откройте файлы с конфликтами через любой редактор.
-
Удалите неактуальный текст и лишние символы (
<<<<<<<
,=======
и>>>>>>>
). -
Сохраните изменения.
-
Добавьте изменения в ветку:
git add <имя_файла>
-
Сделайте коммит изменений:
git commit -m "Описание коммита"
-
Опубликуйте изменения:
git push
Дополнительные команды
Команда | Назначение команды |
---|---|
git log |
Просмотр истории. |
git blame <имя_файла> |
Просмотр внесенных изменений в выбранном файле: показывает, какие пользователи и какую часть файла изменили. |
git blame -L <начальная_строка>, <конечная_строка> <имя_файла> |
Просмотр изменений в определенном диапазоне строк в выбранном файле. |
git branch |
Просмотр всех веток репозитория. Активная ветка будет отмечена * . |
git checkout -- <файл> |
Отмена изменений в файле. Возвращает файл к последнему зафиксированному состоянию. |
git diff |
Просмотр отличий между вашими локальными неотправленными изменениями и последней версией ветки. |
git diff <имя_ветки> |
Просмотр отличий между вашими локальными неотправленными изменениями и последней версией другой ветки. |
git gc |
Оптимизирует локальный репозиторий, освобождая место на диске и удаляя забытые или потерянные данные, которые не используются текущими ветками, но все еще хранятся в репозитории. |
git tag |
Создание тегов для отметки важных точек в развитии проекта, например релизов. |
git remote add <имя_репозитория> <ссылка_на_репозиторий> |
Связывает ваш локальный репозиторий с удаленным репозиторием, чтобы вы могли отправлять туда свои изменения или получать обновления. |
git remote -v |
Просмотр связанных с проектом удаленных репозиториев. |
git stash |
Временное сохранение изменений. |
git stash pop |
Восстановление временно сохраненных изменений. |
git reflog |
Отображает список изменений в журналах git. По умолчанию отображается список изменений в HEAD . |