Создание локального git-репозитория в IntelliJ IDEA
Локальный git-репозиторий — это служебная папка .git внутри вашего проекта, в которой git хранит историю изменений: снимки файлов, авторов и сообщения коммитов. Репозиторий создаётся командой git init и полностью работает на вашем компьютере, без интернета. GitHub нужен на следующем шаге — чтобы отправить эту историю в облако и поделиться проектом.
Где эти пункты меню в новых версиях IntelliJ IDEA
Скриншоты в этом уроке сделаны в актуальной версии IntelliJ IDEA. Если вы работаете в версии до 2020.1 или встретили в другой инструкции старые названия пунктов меню — ниже таблица соответствия:
| Действие | Старый путь (до 2020.1) | Актуальный путь | Горячие клавиши |
|---|---|---|---|
| Создать локальный репозиторий | VCS → Import into Version Control → Create Git Repository | VCS → Enable Version Control Integration… → Git | — |
| Окно с изменениями | View → Tool Windows → Version Control | Окно Commit (изменения) и окно Git (история) | Alt+0 / Alt+9 |
| Добавить файл под контроль версий | Контекстное меню → Add to VCS | Контекстное меню → Git → Add | Ctrl+Alt+A |
| Сделать коммит | VCS → Commit Changes | Git → Commit… | Ctrl+K |
| Опубликовать проект на GitHub | VCS → Import into Version Control → Share Project on GitHub | Git → GitHub → Share Project on GitHub | — |
| Отправить коммиты (push) | VCS → Git → Push | Git → Push… | Ctrl+Shift+K |
| Забрать изменения (pull) | VCS → Git → Pull | Git → Pull… | — |
Шаг 1. Создание локального репозитория
Открываем свой проект в IntelliJ IDEA. Для инициализации локального git-репозитория в верхнем меню выбираем VCS → Enable Version Control Integration… (в версиях до 2020.1 этот пункт назывался VCS → Import into Version Control → Create Git Repository).

и далее Git в выпадающем списке:

После нажатия на кнопку 'Ok', внизу рядом с иконкой Git появиться надпись "Created Git repository in <ПУТЬ К КАТАЛОГУ ПРОЕКТА>":

После создания репозитория появятся два окна — Commit и Git. Если они не появились, откройте их через View → Tool Windows → Commit (Alt+0) и View → Tool Windows → Git (Alt+9). В версиях до 2020.1 это было одно окно Version Control.
Шаг 2. Добавление файлов под контроль версий
Создание репозитория само по себе ничего не отслеживает: git пока не знает, за какими файлами следить. В окне Commit нас интересует вкладка Changes. В списке Unversioned Files находятся файлы, которые не отслеживаются git; IntelliJ IDEA выделяет их коричневым:

Выбираем файлы, изменения в которых хотим отслеживать, вызываем контекстное меню и выбираем Git → Add (в версиях до 2020.1 этот пункт назывался Add to VCS):

Обычно в репозиторий добавляют исходный код (например, .java, .xml) и файлы конфигурации сборки (pom.xml, build.gradle). Скомпилированные и временные файлы (.class, папки target, out, build) коммитить не нужно — их проще один раз перечислить в .gitignore.
Сделайте .gitignore до первого коммита
Файл .gitignore в корне проекта избавляет от ручного выбора файлов: git просто перестаёт предлагать всё лишнее. Минимальный набор для Java-проекта — target/, out/, build/, *.class, .idea/, *.iml. Если файл уже попал в репозиторий, добавление строки в .gitignore его оттуда не удалит: сначала нужно выполнить git rm --cached.
После добавления файл Main.java переместился в список Changes — здесь находятся отслеживаемые git файлы, которые попадут под контроль версий после коммита. Только что добавленные файлы IntelliJ IDEA выделяет зелёным:

Если проект уже находится под контролем версий, то при создании нового файла IntelliJ IDEA сама предложит добавить его в git:

Соглашаемся — нажимаем Yes.
Шаг 3. Коммит
Коммит сохраняет состояние проекта в репозиторий: git делает снимок (snapshot) всех файлов из Changes на текущий момент. В Changes выбираем файлы для коммита и заполняем поле Commit message — коротко описываем, какие изменения сделаны в этом коммите:

Если изменить файл, который уже был закоммичен, он снова попадёт в Changes, но подсветится синим: для git это уже не новый файл, а изменённый.
Чтобы просмотреть все коммиты, перейдите на вкладку Log. Там видно, кто и когда сделал коммит, какие файлы изменились и с каким сообщением:

Commit и Commit and Push — разные кнопки
Обычный Commit сохраняет снимок только в локальном репозитории: на GitHub изменений пока нет. Commit and Push сразу отправляет коммит в удалённый репозиторий. Это удобно, но помните: отправленный коммит уже видят другие, переписать историю безболезненно не получится.
Шаг 4. Публикация проекта на GitHub
Пока всё происходило на вашем компьютере. Чтобы выложить проект в сеть, в верхнем меню выбираем Git → GitHub → Share Project on GitHub (в версиях до 2020.1 — VCS → Import into Version Control → Share Project on GitHub):

Откроется окно, где нужно указать имя репозитория и его видимость (публичный или приватный). После подтверждения IntelliJ IDEA создаст репозиторий на GitHub, привяжет его как origin и выполнит первый push. Ветка по умолчанию на GitHub с октября 2020 года называется main, а не master — это имя и будет в адресной строке репозитория.
Перед публикацией убедитесь, что аккаунт GitHub подключён к IDE: Подключение аккаунта GitHub к IntelliJ IDEA
Шаги 5 и 6. Операции push и pull
Push отправляет локальные коммиты в удалённый репозиторий на GitHub. Вызывается через Git → Push… (или Ctrl+Shift+K); в версиях до 2020.1 этот пункт назывался VCS → Git → Push. В окне видно список коммитов, которые уйдут на сервер:

Pull делает обратное: забирает с GitHub коммиты, которых нет у вас локально. Нужен, когда вы работаете с двух компьютеров или в команде. Вызывается через Git → Pull… (в версиях до 2020.1 — VCS → Git → Pull):

Если проект уже лежит на GitHub и его нужно наоборот скачать себе, посмотрите урок Клонирование проекта с GitHub в IntelliJ IDEA.
Те же шаги в терминале
Кнопки IDE выполняют обычные команды git. Полезно знать их: в терминале понятнее, что именно произошло, и это единственный вариант на сервере без графического интерфейса. Тот же сценарий с нуля до GitHub выглядит так:
git init # создать локальный репозиторий (.git)
git add Main.java # добавить файл под контроль версий
git add . # или всё, что не попало в .gitignore
git commit -m "Initial commit" # сделать снимок состояния проекта
git remote add origin https://github.com/username/my-project.git
git branch -M main # переименовать ветку в main
git push -u origin main # первый push: связать локальную ветку с удалённой
git pull # забрать изменения с GitHub Встроенный терминал IntelliJ IDEA открывается по Alt+F12 и работает в каталоге проекта, так что команды можно выполнять прямо оттуда.
На чём чаще всего спотыкаются
- Коммитят папку
.ideaи*.iml. Это настройки вашей IDE, а не код проекта: у коллег они вызывают постоянные конфликты. Место таким файлам — в.gitignore. - Коммитят
target,out,buildи.class. Скомпилированные файлы получаются из исходников за секунды, но раздувают репозиторий и историю. - Считают, что коммит попал на GitHub. Коммит — локальная операция. Пока не выполнен push, изменения существуют только на вашем компьютере.
- Пишут сообщения вида «fix», «123», «update». Через месяц по такому логу невозможно понять, что менялось; формулируйте, что сделано: «Add validation to User form».
- Заливают в публичный репозиторий пароли и ключи. Токены, пароли от БД,
application.propertiesс реальными данными — удалить их из истории потом гораздо сложнее, чем не коммитить сразу.
Часто задаваемые вопросы
В меню IntelliJ IDEA нет пункта Import into Version Control. Что делать?
Начиная с версии 2020.1 этот пункт убрали. Если проект ещё не под git, выберите VCS → Enable Version Control Integration… и укажите Git. Если репозиторий уже создан, меню VCS заменяется на меню Git, где лежат Commit, Push, Pull и подменю GitHub. Альтернатива — выполнить git init во встроенном терминале, IDE подхватит репозиторий автоматически.
Нужно ли добавлять в репозиторий папки .idea, target и out?
Нет. В git попадает то, из чего проект собирается: исходники, ресурсы, pom.xml или build.gradle. Папки .idea, target, out и файлы .class генерируются локально и должны быть перечислены в .gitignore. Исключение — отдельные файлы из .idea, если команда сознательно договорилась хранить общие настройки инспекций или стиля кода.
Почему GitHub не принимает пароль при push?
GitHub отключил вход по паролю для операций по HTTPS 13 августа 2021 года. Нужен персональный токен доступа (Personal Access Token) вместо пароля либо вход через браузер по OAuth: File, Settings, Version Control, GitHub, кнопка Log In with GitHub. Токен создаётся на GitHub в Settings, Developer settings, Personal access tokens и для приватных репозиториев требует область repo. Второй вариант — подключаться по SSH-ключу.
Push отклонён с ошибкой non-fast-forward. Как это исправить?
Это значит, что в удалённой ветке есть коммиты, которых нет у вас: кто-то запушил раньше или вы добавили файл через веб-интерфейс GitHub. Сначала выполните Git, Pull (IDE предложит merge или rebase), при необходимости разрешите конфликты, затем повторите push. Делать push с флагом force не стоит — так можно затереть чужие коммиты.
Видео объяснение
Предпочитаете видеоформат? Посмотрите этот урок с примерами и объяснениями.
Комментарии