Git и GitHub — разница и основные команды
Вы клонировали репозиторий, поправили пару файлов, сделали коммит и выполнили git push — а в ответ получили ! [rejected] main -> main (fetch first). Ничего не сломалось: пока вы работали, коллега отправил свои коммиты, и ваша история разошлась с удалённой. Лечится это одной командой — git pull --rebase, а затем повторным git push. Такие сообщения перестают пугать, как только понимаешь, чем Git отличается от GitHub и что делает каждая команда.
Git — это распределённая система контроля версий, которая устанавливается на компьютер и хранит историю изменений проекта локально. GitHub — это облачный веб-сервис для хостинга Git-репозиториев и совместной разработки. Проще говоря: Git — инструмент, GitHub — площадка, где результаты работы этого инструмента лежат и обсуждаются.
Git и GitHub — в чём разница
Git создал Линус Торвальдс в 2005 году для разработки ядра Linux. Git отслеживает изменения в коде, умеет работать с ветками, объединять правки разных разработчиков, откатывать состояние проекта и делать всё это офлайн — полная история проекта лежит у вас на диске.
GitHub появился в 2008 году и с 2018 года принадлежит Microsoft. Он добавляет к Git веб-интерфейс, pull requests, code review, трекер задач (issues), CI/CD (GitHub Actions), хостинг статических сайтов (GitHub Pages) и права доступа для команды. Слоган GitHub — Social Coding: это не просто хранилище кода, а платформа для открытых и закрытых проектов.
| Признак | Git | GitHub |
|---|---|---|
| Что это | Программа — распределённая система контроля версий | Веб-сервис для хостинга Git-репозиториев |
| Где работает | Локально на вашем компьютере, интернет не нужен | В облаке, доступ через браузер или API |
| Год появления | 2005, автор — Линус Торвальдс | 2008, с 2018 года принадлежит Microsoft |
| Основные возможности | Коммиты, ветки, слияния, история, откаты | Pull requests, issues, code review, Actions, Pages |
| Зависимость | Работает полностью без GitHub | Без Git не имеет смысла — хранит именно Git-репозитории |
| Аналоги | Mercurial, Subversion (SVN), Perforce | GitLab, Bitbucket, Gitea, Azure Repos |
| Стоимость | Бесплатно, открытый исходный код | Бесплатный тариф + платные планы для команд |
Короткий ответ на вопрос «в чём разница»: Git — это технология, GitHub — сервис, построенный вокруг этой технологии. Git можно использовать без GitHub, а вот GitHub без Git не существует.
Состояния файлов в рабочем каталоге Git
Git делит все файлы проекта на две группы: отслеживаемые и неотслеживаемые.
- Отслеживаемые файлы — те, что попали в последний снимок состояния проекта (snapshot) или уже добавлены в индекс. Они бывают неизменёнными, изменёнными и подготовленными к коммиту (staged).
- Неотслеживаемые файлы — всё остальное: файлы, которых не было в последнем коммите и которые вы ещё не добавили командой
git add.
Файл путешествует по трём областям: рабочий каталог → индекс (staging area) → репозиторий.
| Состояние | Где находится файл | Что вывел git status | Как перевести дальше |
|---|---|---|---|
| Неотслеживаемый (untracked) | Рабочий каталог | Untracked files | git add file |
| Изменённый (modified) | Рабочий каталог | Changes not staged for commit | git add file |
| Подготовленный (staged) | Индекс | Changes to be committed | git commit -m "..." |
| Зафиксированный (committed) | Локальный репозиторий | nothing to commit, working tree clean | git push |
Посмотреть текущее состояние всех файлов можно одной командой:
git status
git status -s # короткий формат: ?? новый файл, M изменён, A добавлен в индекс Основные команды git
Ниже — минимальный набор, которого хватает для повседневной работы.
| Команда | Что делает | Когда нужна |
|---|---|---|
git init | Создаёт новый локальный репозиторий в текущей папке | Старт проекта с нуля |
git clone | Скачивает удалённый репозиторий вместе со всей историей | Начало работы с чужим или командным проектом |
git add | Добавляет изменения в индекс (staging area) | Перед каждым коммитом |
git commit | Фиксирует снимок подготовленных изменений в истории | Когда законченный кусок работы готов |
git fetch | Забирает новые данные с сервера, но ничего не сливает | Хотите посмотреть чужие изменения, не трогая свои |
git pull | fetch + merge (или rebase) в текущую ветку | Перед началом работы и перед push |
git push | Отправляет локальные коммиты в удалённый репозиторий | Когда нужно поделиться результатом |
git log | Показывает историю коммитов | Поиск, кто и когда внёс изменение |
git diff | Показывает, что именно изменилось | Проверка перед коммитом |
Типичный цикл работы
git status # что изменилось
git add . # подготовить все изменения к коммиту
git commit -m "Add user validation"
git pull --rebase # забрать чужие коммиты и наложить свои сверху
git push # отправить на сервер Что важно знать про commit, fetch, pull и push
git commit сохраняет состояние проекта: Git запоминает, как выглядит каждый файл в этот момент, и сохраняет ссылку на снимок. Если файл не менялся, Git не дублирует его, а создаёт ссылку на уже сохранённую идентичную версию — поэтому история занимает мало места.
git fetch связывается с удалённым репозиторием и забирает данные, которых у вас ещё нет. После этого появляются ссылки на все удалённые ветки (origin/main и другие), их можно просмотреть или слить. Важно: fetch не изменяет вашу рабочую копию — сливать изменения вы решаете сами.
git pull — это fetch плюс автоматическое слияние удалённой ветки в текущую. При клонировании Git сам настраивает локальную ветку на отслеживание ветки по умолчанию удалённого репозитория (обычно main), поэтому git pull без аргументов знает, откуда тянуть.
git push отправляет ваши коммиты в удалённый репозиторий. Команда сработает, только если у вас есть права на запись и если после вашего последнего fetch никто не отправил туда новые коммиты. Если коллега успел раньше, ваш push будет отклонён с ошибкой non-fast-forward — нужно сначала забрать чужие изменения и объединить их со своими.
Важно
Флаг --rebase у git pull накладывает ваши коммиты поверх чужих и не создаёт лишний merge-коммит — история остаётся линейной. Настроить поведение по умолчанию можно один раз: git config --global pull.rebase true.
Команды для работы с GitHub
Отдельных «команд GitHub» в терминале нет — с GitHub вы работаете теми же командами Git, просто в качестве удалённого репозитория указываете адрес на github.com.
Клонировать чужой проект
git clone https://github.com/user/project.git
cd project Отправить локальный проект на GitHub
Создайте пустой репозиторий на GitHub (без README), затем выполните:
git init
git add .
git commit -m "Initial commit"
git branch -M main
git remote add origin https://github.com/user/project.git
git push -u origin main Флаг -u связывает локальную ветку с удалённой, поэтому дальше достаточно писать просто git push и git pull.
Проверить и изменить адрес репозитория
git remote -v # какие удалённые репозитории настроены
git remote add upstream https://github.com/original/project.git
git remote set-url origin [email protected]:user/project.git # перейти на SSH Устаревший способ входа
С 13 августа 2021 года GitHub не принимает пароль от аккаунта при работе по HTTPS. Вместо пароля нужно ввести Personal Access Token (Settings → Developer settings → Tokens) либо настроить SSH-ключ. Старые инструкции, где просят «ввести логин и пароль», больше не работают.
Ветвление, слияние и конфликты
Ветвление (branching) — это возможность вести независимые линии разработки: новая функция, эксперимент или исправление бага не мешают основному коду. Git хранит проект как серию снимков, а ветка — это всего лишь лёгкий указатель на конкретный коммит, поэтому создание ветки занимает доли секунды.
git branch # список веток
git switch -c feature/login # создать ветку и перейти в неё
git switch main # вернуться в основную ветку
git merge feature/login # влить ветку в текущую
git branch -d feature/login # удалить влитую ветку Команды git switch (переключение веток) и git restore (откат изменений в файлах) появились в Git 2.23 и заменяют перегруженный git checkout, который делал и то, и другое. Старый вариант git checkout -b feature/login по-прежнему работает.
Конфликт слияния возникает, когда одна и та же строка изменена в двух ветках. Git помечает спорное место в файле маркерами <<<<<<<, =======, >>>>>>>. Нужно вручную оставить правильный вариант, убрать маркеры и завершить слияние:
git add ConflictedFile.java
git commit main или master?
С октября 2020 года новые репозитории на GitHub создаются с веткой по умолчанию main, а не master. Технически это обычное имя ветки: старые проекты продолжают жить с master, и обе ветки ничем не отличаются по поведению. Проверить имя можно командой git branch --show-current.
Метки (tags) и релизы
Метка (tag) — это неподвижная закладка на конкретном коммите. В отличие от ветки, метка не двигается вперёд, поэтому ею отмечают выпуски стабильных версий: v1.0, v2.0.1.
git tag v1.0 # лёгкая метка
git tag -a v1.0 -m "First release" # аннотированная метка с автором и датой
git push origin v1.0 # метки не уходят на сервер обычным git push На GitHub метка становится основой для Release — страницы с описанием версии и собранными артефактами (например, JAR-файлом).
Fork и pull request
Удалённый репозиторий — это версия проекта, размещённая на сервере (например, на GitHub). Удалённых репозиториев может быть несколько и с разными правами: только чтение или чтение и запись.
Если вы хотите поучаствовать в чужом проекте, но прав на запись у вас нет, используйте fork — кнопку, которая создаёт копию репозитория в вашем аккаунте. Дальше схема такая:
- Нажимаете Fork на странице проекта — копия появляется у вас.
- Клонируете свою копию:
git clone. - Создаёте ветку, вносите изменения, делаете коммит и
git push. - Открываете pull request в оригинальный репозиторий.
- Автор проекта просматривает код (code review) и принимает или отклоняет изменения.
Fork — стандартный способ работы с open source. GitHub сохраняет связь вашей копии с оригиналом, поэтому изменения из upstream можно подтягивать кнопкой Sync fork или командами:
git remote add upstream https://github.com/original/project.git
git fetch upstream
git merge upstream/main На чём чаще всего спотыкаются новички
- Коммит без индексации.
git commitфиксирует только то, что добавлено черезgit add. Изменённый, но не проиндексированный файл в коммит не попадёт. - git add . в корне проекта. Так в репозиторий улетают папки
target/,.idea/, файлы*.classи, что хуже, пароли из конфигов. Заведите.gitignoreдо первого коммита. - Пуш без pull. Ошибка
! [rejected] ... (non-fast-forward)означает, что на сервере есть коммиты, которых нет у вас. Решение —git pull --rebase, а неgit push --force: force-push затирает чужую работу. - git pull с незакоммиченными изменениями. Git откажется сливать. Либо закоммитьте, либо отложите правки:
git stash, затемgit stash pop. - Отсоединённый HEAD (detached HEAD). Возникает после
git checkout <хеш коммита>. Коммиты, сделанные в этом состоянии, не принадлежат ни одной ветке и легко теряются — вернитесь командойgit switch -или сохраните работу в новой ветке. - Путаница в терминах. Pull request — это запрос на GitHub, а не команда
git pull. Общего у них только слово.
Часто задаваемые вопросы
Можно ли пользоваться Git без GitHub?
Да. Git работает полностью локально: git init, коммиты, ветки и история доступны без интернета и без единого аккаунта. GitHub нужен, когда репозиторий должен быть доступен другим людям, нужна резервная копия в облаке или командное ревью кода. Вместо GitHub можно использовать GitLab, Bitbucket или собственный сервер.
Чем pull request отличается от команды git pull?
Это разные вещи. git pull — команда Git, которая забирает изменения с сервера в вашу локальную ветку. Pull request — функция GitHub: предложение владельцу репозитория влить вашу ветку в основную, с обсуждением, комментариями к коду и проверками CI. В GitLab аналогичная функция называется merge request.
Как отменить последний коммит?
Если коммит ещё не отправлен на сервер, используйте git reset: команда git reset --soft HEAD~1 вернёт изменения в индекс, а git reset --hard HEAD~1 удалит их совсем. Если коммит уже в общем репозитории, безопаснее git revert HEAD — он создаёт новый коммит, отменяющий предыдущий, и не переписывает историю, которую уже скачали коллеги.
Почему GitHub не принимает мой пароль при git push?
С 13 августа 2021 года аутентификация по паролю для операций с Git отключена. Создайте Personal Access Token в разделе Settings, Developer settings, Personal access tokens и вводите его вместо пароля, либо настройте SSH-ключ и смените адрес репозитория командой git remote set-url origin.
Чем GitHub отличается от GitLab и Bitbucket?
Все три сервиса хранят обычные Git-репозитории, поэтому команды Git в них одинаковые, а проект можно перенести между ними без потерь. Отличаются экосистема и акценты: у GitHub крупнейшее open source-сообщество и GitHub Actions, GitLab делает ставку на встроенный DevOps-цикл и удобную установку на свой сервер, Bitbucket тесно интегрирован с Jira и другими продуктами Atlassian.
Видео объяснение
Предпочитаете видеоформат? Посмотрите этот урок с примерами и объяснениями.
Комментарии