Git — это распределенная система контроля версий, которая помогает разработчикам отслеживать изменения в коде, работать в команде и управлять историей проекта. Она позволяет сохранять разные версии файлов, возвращаться к ним при необходимости и совместно работать над одним проектом без потери данных.
Использование git значительно упрощает работу над сложными проектами, обеспечивает прозрачность изменений и помогает избегать конфликтов при совместной работе.
В этом руководстве рассмотрим основные команды для работы с git без использования графического интерфейса:
Обновление локальной копии репозитория (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 <имя_ветки_с_изменениями>
Если в процессе объединения возникнут конфликты, их нужно решить вручную.
После успешного слияния ветка, которая «вливалась» в основную, обычно не удаляется автоматически — ее нужно удалить вручную.
Если ветка больше не нужна, ее можно удалить командой:
git branch -d <имя_ветки>
Если у вас есть невнесенные изменения в ветке, которые могут быть потеряны при удалении, команда выдаст ошибку. Посмотреть текущие невнесенные изменения можно с помощью команды:
git status
В ответном сообщении будут выведены файлы с изменениями, которые не были добавлены в коммит.
Чтобы принудительно удалить ветку, выполните команду:
git branch -D <имя_ветки>
Важно
При принудительном удалении все изменения, которые не были добавлены в коммит, будут потеряны. Убедитесь, что все важное сохранено.
Дополнительные действия с ветками
Чтобы отправить ветку на сервер, выполните команду:
git push origin <имя_ветки>
Команда отправит вашу локальную ветку в удаленный репозиторий, делая ее доступной для других участников проекта.
Чтобы просмотреть все ветки в репозитории, выполните команду:
git branch -a
Результатом будет список всех веток, доступных в вашем репозитории, включая те, что находятся на сервере.
Чтобы восстановить ранее удаленную ветку, выполните команду:
Из удаленной ветки будет создана новая ветка. Это позволит восстановить утерянные или ошибочно стертые данные.
Коммиты
После сохранения изменений в файлах репозитория необходимо подготовить их к коммиту.
Коммиты — это «снимки» состояния ваших файлов в определенный момент времени. Они позволяют отслеживать историю изменений и возвращаться к нужным версиям.
Совет
Регулярно делайте коммиты даже после небольших изменений.
Добавление изменения в коммит (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, его восстановление невозможно.
Чтобы найти нужный коммит, посмотрите журнал ссылок, выполнив команду:
В выводе команды найдите нужный коммит по его описанию.
Скопируйте его хеш. Обычно это первые 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 reset и git push)
Чтобы отменить ваши последние изменения на сервере и вернуть ветку к предыдущему состоянию, выполните следующие шаги:
Верните локальную ветку к состоянию перед последним коммитом. Для этого выполните команду, которая удалит последний коммит и восстановит файлы до предыдущего состояния:
git reset --hard HEAD^
Обновите удаленную ветку, чтобы она соответствовала текущему состоянию локальной. Для этого выполните команду принудительной отправки изменений:
git push --force
Будьте осторожны, так как использование параметра --force может привести к потере данных у других участников проекта, если они уже синхронизировались с удаленным репозиторием. Изменения, внесенные ими после синхронизации, также будут стерты. Перед выполнением рекомендуется предупредить команду или убедиться, что никто не потеряет важную информацию.
Примечание
Если ваши изменения еще не внесены в коммит — сначала сделайте commit, затем push.
Решение конфликтов
Конфликты слияния возникают, когда git не может автоматически объединить изменения из разных веток. Это происходит, когда в репозитории есть противоречивые изменения, сделанные в одних и тех же местах.
Причины возникновения конфликтов:
Одновременная работа нескольких людей над одними файлами.
Обновление локальной копии с сервера (git pull), когда изменения в удаленном репозитории противоречат вашим локальным правкам.
Слияние веток (git merge), если в них были сделаны разные изменения в одних и тех же участках кода.
Попытка отправки изменений (git push) в удаленный репозиторий, если в нем уже есть коммиты, противоречащие вашим локальным правкам.
Типы конфликтов:
Конфликты изменения строк — наиболее распространенный тип конфликта, который возникает, когда одна и та же строка файла изменена по-разному в разных ветках.
На вкладке Домой в секции Ваша мастерская перейдите в раздел Репозитории.
Выберите репозиторий.
На странице репозитория в разделе Код перейдите в секцию Предложения изменений.
Выберите предложение изменений и в правом верхнем углу нажмите Принять.
На странице предложения изменений изучите сообщение о конфликтах, например:
Объединение заблокировано
...
В этой ветке есть конфликты, которые нужно разрешить
filename.js
CONFLICT (content): Automatic merge failed to resolve conflict in filename.js; Manual content merge required
Нажмите Разрешить в интерфейсе.
Откроется интерфейс редактирования кода, где будут помечены проблемные участки специальными маркерами:
1 ...
2 Общая часть текста до конфликта
3 ...
[Принять текущее] [Принять входящее] [Принять оба изменения]
4 <<<<<<< main
5 Изменения в текущей ветке
6 =======
7 Изменения во входящей ветке
8 >>>>>>> feature-branch
9 ...
10 Общая часть текста после конфликта
11 ...
Где:
Принять текущее, Принять входящее, Принять оба изменения — кнопки для разрешения отдельного конфликта.
<<<<<<< main — начало изменений в текущей ветке.
======= — разделитель между версиями.
>>>>>>> feature-branch — конец изменений из входящей ветки.
Разрешите конфликты:
Чтобы разрешить отдельный конфликт, нажмите возле проблемного участка:
Принять текущее — принять изменения из текущей ветки.
Принять входящее — принять изменения из входящей ветки.
Принять оба изменения — принять изменения из обеих веток.
Чтобы разрешить все конфликты, справа вверху нажмите:
Принять текущий — принять все изменения из текущей ветки.
Принять входящий — принять все изменения из входящей ветки.
Важно
В этом случае будут приняты все изменения, даже если перед этим вы иначе разрешали отдельные конфликты.
Нажмите Пометить решенным и Сохранить изменения.
Определите файлы с конфликтами, выполнив команду:
git status
Файлы с конфликтами отобразятся с пометкой both modified.
Откройте файл с конфликтом в текстовом редакторе.
Найдите маркеры конфликта (<<<<<<<, =======, >>>>>>>).
Выберите вариант решения конфликта:
Удалите ненужную версию.
Создайте новый код, объединяющий обе версии.
После внесения изменений удалите все маркеры конфликта.
Сохраните файл.
Добавьте измененный файл в индекс:
git add <имя_файла>
Завершите слияние:
git commit -m "Resolve merge conflict"
Опубликуйте изменения:
git push
Конфликты в файловой структуре (tree conflicts)
Чтобы разрешить конфликт, когда файл был изменен в одной ветке и удален в другой:
Посмотрите статус конфликта:
git status
Выберите дальнейшее действие с файлом:
Чтобы оставить файл, выполните команду:
git add <имя_файла>
Чтобы удалить файл, выполните команду:
git rm <имя_файла>
Завершите слияние:
git commit -m "Resolve file deletion conflict"
Использование инструментов слияния
Для удобного разрешения конфликтов можно использовать графические инструменты.
Чтобы запустить настроенный инструмент слияния, например VS Code, Sublime Merge или другие, выполните команду:
git mergetool
Прерывание слияния
Чтобы отменить слияние и вернуться к состоянию до начала операции, выполните команду:
Просмотр изменений в определенном диапазоне строк в выбранном файле.
git branch
Просмотр всех веток репозитория. Активная ветка будет отмечена *.
git checkout -- <файл>
Отмена изменений в файле. Возвращает файл к последнему зафиксированному состоянию.
git diff
Просмотр отличий между вашими локальными неотправленными изменениями и последней версией ветки.
git diff <имя_ветки>
Просмотр отличий между вашими локальными неотправленными изменениями и последней версией другой ветки.
git gc
Оптимизирует локальный репозиторий, освобождая место на диске и удаляя забытые или потерянные данные, которые не используются текущими ветками, но все еще хранятся в репозитории.
git tag
Создание тегов для отметки важных точек в развитии проекта, например релизов.