gitverse-demo-hello2
Gitverse
Основы git, работа с gitverse. Летняя цифровая школа Сбера 2024.
Основные ссылки
- GitVerse: https://gitverse.ru
- GitVerse документация: https://gitverse.ru/docs/get-started/quick-start/
- Первоначальная настройка Git: https://git-scm.com/book/ru/v2/Введение-Первоначальная-настройка-Git
Настройка рабочего места
Ссылка по генерации ssh-ключа: https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent Ссылка по использованию разных ssh-ключей для разных host: https://www.baeldung.com/linux/ssh-private-key-git-command MacOS
- В терминале выполнить команду ssh-keygen -t ed25519 -C "your-mail@yaya.ru"
- Ваш email должен совпадать с тем, который указан в аккаунте gitverse.
- Задайте имя ключа
(можно любое)id_ed25519_gitverse - Пароль можно не задавать (нажмите Enter).
- Исправьте ваш файл ~/.ssh/config, добавив в начало файла следующую конструкцию
# GitVerse
Host gitverse.ru
Hostname gitverse.ru
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_ed25519_gitverse
- В терминале выполнить команду
и содержимое скопировать в буфер обменаcat ~/.ssh/id_ed25519_gitverse.pub - На портале gitverse.ru перейти в Настройки > SSH ключи и добавить свой ключ (содержимое буфера обмена из пункта выше)
Все готово к работе, поехали дальше :)
Создание репозитория
- Логинимся на портал gitverse.ru
- Для приватности, рекомендуется в Настройках вашего Профиля установить флажок "Скрыть ваш email: ..."
- Сверху выбираем Добавить > Новый репозиторий
- При необходимости перенести репозиторий из других сервисов, выберите "Перенести сюда" (нам это не нужно)
- Указываем название репозитория gitverse-demo-hello
- В описании указываем
(или что-то другое, напримерДемо проект для gitverse
)я люблю gitverse :) - Ниже выбираем опцию
(при необходимости, в будущем, вы можете выбирать опциюПубличный
, чтобы ваш проект был доступен только по приглашению)Приватный - Отмечаем галочкой Добавить файл README.md
- Отмечаем галочкой
, из списка выбираемДобавить .gitignore
,JavaMaven - Нажимаем кнопку Создать репозиторий
- У вас появился экран с вашим репозиторием :)
Работа с репозиторием
У вас должна быть установлена утилита git. Для установки на Mac выберите одну из опций:
- Доступна по умолчанию
(предварительно установите brew, см. https://formulae.brew.sh)brew install git- Вручную, см. https://git-scm.com/book/en/v2/Getting-Started-Installing-Git Для установки на Windows:
- https://git-scm.com/book/en/v2/Getting-Started-Installing-Git
Для проверки выполните команду
, которая покажет вам глобальные и локальные конфигурации git.
- Для начала нужно клонировать созданный ранее репозиторий:
- На портале gitverse.ru, на странице репозитория
найдите кнопкуgitverse-demo-hello
, нажмите ее, выберитеКлонироватьSSH - В терминале перейдите в папку, где будет ваш репозиторий
- Выполните команду
(заменитеgit clone ssh://git@gitverse.ru:2222/(username)/gitverse-demo-hello.git
на ваш login, который указан под именем на портале gitverse.ru)(username)
- На портале gitverse.ru, на странице репозитория
- Клонируйте себе также репозиторий
(там содержится demo приложение)git clone ssh://git@gitverse.ru:2222/nkozlov/gitverse-demo-example.git - Скопируйте все файлы (кроме README.md) и папки из директории
в кореньgitverse-demo-example/gitverse-demo-hello/ - Перейдите в папку gitverse-demo-hello/
- Установите правильно имя и email, используя команды ниже (необходимо заменить имя пользователя и email, email должен совпадать с тем, что указан в gitverse) Для установки локально:
$ git config user.name "John Doe"
$ git config user.email johndoe@example.com
Для установки глобально (флаг --global):
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
Готово, двигаемся дальше :)
Основные команды Git
- В терминале заходим в папку gitverse-demo-hello
- Выполняем команду
(просмотр истории коммитов) Результат:git log
commit 981aa9985eafff985dc8bab29ce8d0fa4ac26705 (HEAD -> master, origin/master, origin/HEAD)
Author: Никита Козлов <nkozlov@noreply.gitverse.ru>
Date: Wed Jul 17 10:51:11 2024 +0000
Initial commit
- Выполняем команду
(показ состояния репозитория)git status
Результат:
On branch master
Your branch is up to date with 'origin/master'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
.DS_Store
_dev/
mvnw
mvnw.cmd
pom.xml
src/
nothing added to commit but untracked files present (use "git add" to track)
- Добавим все наши изменения в индекс (staging)
, затем посмотримgit add -A .git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: .DS_Store
new file: _dev/client.rest
new file: mvnw
new file: mvnw.cmd
new file: pom.xml
new file: src/.DS_Store
new file: src/main/.DS_Store
new file: src/main/java/ru/sberbank/corpunivers/gitverse/GitverseDemoExample.java
new file: src/main/java/ru/sberbank/corpunivers/gitverse/controller/GitverseHelloController.java
new file: src/main/resources/application.properties
- Мы видим лишние файлы
(системные файлы macOs), которые попали в index, чтобы их удалить у нас есть несколько опций.DS_Store- Выполнить команду
, теперьgit rm --cache **/.DS_Store
показывает, что все файлыgit status
находятся в.DS_StoreUntracked files - Выполнить команду
(чтобы очистить индекс), а затем выполнить командуgit reset HEADgit add --all . -- ':!**/.DS_Store' ':!.DS_Store' - Добавить в файл .gitignore
и выполнить изначальную команду.DS_Store
(рекомендуемый способ)git add -A .
- Выполнить команду
- Создаем коммит командой git commit -m "It's first commit, I love gitverse :)"
Теперь
выдает сообщениеgit status
, аYour branch is ahead of 'origin/master' by 1 commit.
показывает новый commitgit log- Если потребуется изменить автора commit (последнего), то выполните команду git commit --amend --author "Ivan Petrov <myEmail@ya.ru>" --no-edit
Это может возникнуть, если вы забыли поправить git config или поправили его неверно - Если потребуется изменить дату commit (последнего) на текущую, то выполните команду GIT_COMMITTER_DATE="$(date)" git commit --amend --no-edit --date "$(date)"
- Если потребуется изменить автора commit (последнего), то выполните команду
- Давайте отправим изменения на сервер (push) git push origin master
- Зайдем на портал gitverse.ru, в репозиторий
, просмотрим изменения в репозитории, зайдем в commit, просмотрим файлыgitverse-demo-hello
Идем дальше!
Работа с ветками, PR
В данном разделе мы рассмотрим процесс создания веток, выставления PR, правки PR и merge в master. А также узнаем как делать squash commit (объединение коммитов). Для начала необходимо узнать основные правила именования веток в Git (в зависимости от flow они могут отличаться):
: основная ветка в репозитории, содержит стабильную версию кодаmaster
: используется в GitFlow, основная ветка для разработки, все новые изменения в коде сначала попадают сюдаdevelop
Пример:develop
: ветки для разработки новой функциональностиfeature
Пример:feature/TASK-32_vault
: ветки для исправления дефектов Пример:hotfixhotfix/SUPPORT-554
Создание ветки
- Создадим feature ветку и сразу переключимся на нее git checkout -b feature/firstBranch
Ветка создается в локальном репозитории и сервер о ней ничего не знает, пока не выполнить командуgit push ... - Выполним команду
, чтобы увидеть все ветки репозиторияgit branch -a
* feature/firstBranch
master
remotes/origin/HEAD -> origin/master
remotes/origin/master
- Внесем изменения в существующий файл
, заменив строкуsrc/main/java/ru/sberbank/corpunivers/gitverse/controller/GitverseHelloController.java
наHello from Gitverse!Я люблю Gitverse! - Создадим новый файл
, оставим его пустымsrc/main/resources/application-dev.properties - Выполним команду git status
Видим наши изменения
означает, что файл был изменен, а вmodified: src/main/java/ru/sberbank/corpunivers/gitverse/controller/GitverseHelloController.java
содержатся файлы, которые были добавленыUntracked files:
On branch feature/firstBranch
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)
modified: src/main/java/ru/sberbank/corpunivers/gitverse/controller/GitverseHelloController.java
Untracked files:
(use "git add <file>..." to include in what will be committed)
src/main/resources/application-dev.properties
no changes added to commit (use "git add" and/or "git commit -a")
- Добавляем файлы в index (stage)
, еще раз выполняем командуgit add -A .git status
Видим, что все наши изменения добавлены в index
On branch feature/firstBranch
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: src/main/java/ru/sberbank/corpunivers/gitverse/controller/GitverseHelloController.java
new file: src/main/resources/application-dev.properties
- Создаем commit git commit -m "I have created my first branch ever!"
[feature/firstBranch 6647e7d] I have created my first branch ever
2 files changed, 1 insertion(+), 1 deletion(-)
create mode 100644 src/main/resources/application-dev.properties
- Отправляем изменения на сервер git push origin feature/firstBranch
- Обновляем страницу на gitverse.ru c открытым репозиторием, в выпадающем списке, где написано
появилось новое значениеmasterfeature/firstBranch - Перейдите в ветку на портале gitverse.ru и посмотрите свои изменения через web-интерфейс
- Рядом с выпадающим списком с ветками, вы можете нажать на
(обратите внимание, что вКоммиты: 3maser
, наша новая ветка опережаетКоммиты: 2
на 1 commit)master
Откроется таблица, в строке с вашим commit, справа будет хэш, нажмите на него и сможете просмотреть изменения через web-интерфейс
- Рядом с выпадающим списком с ветками, вы можете нажать на
Создание PR и работа с ним
PR - это pull request, который необходимо сделать, когда вы хотите влить изменения из одной ветки в другую, как в нашем примере из
в
.
- На портале gitverse.ru на странице репозитория вы находитесь на вкладке
, перейдите на вкладкуКодЗапросы - Нажмите Создать новый запрос
- Меняем
наИз ветки
, аfeature/firstBranch
должно быть значениеВ веткуmaster - Поле
оставляем без измененийНазвание
На коммерческих проектах здесь указывают номер тикета и краткое название - Проверяем количество коммитов и раздел Измененные файлы
- Нажимаем кнопку
, PR создан, на экране отрылсяСоздать запрос - Здесь вы можете добавить Ревьюеров, оставить комментарии к коду, вести обсуждения
- Допустим вам дали замечание к коду и нужно поправить ваше сообщение
- В той же ветке замените сообщение
наЯ люблю Gitverse!Я люблю Gitverse, честно! - Выполните последовательно команды
,git add -A .
,git commit -m "I have fixed my fault"git push origin feature/newLines - Теперь в web-интерфейсе вашего PR коммитов стало 2, а внесенные изменения видны на вкладе Измененные файлы
- В той же ветке замените сообщение
- На вкладке
нажмитеОбсуждение
, при желании можете удалить веткуСоздать коммит на слияние
Если вы удалите ветку, то в терминале напишите
, чтобы обновить локальные данные об удаленном репозиторииgit fetch - Перейдите на вкладку
, выберите веткуКод
, нажмите наmaster
, убедитесь, что все ваши все ваши commit'ы присутствуютКоммиты: 5
Также вы видите еще один commit, который называется merge-commit и содержит все изменения после слияния веток. Чтобы его избежать необходимо сделать rebase перед merge - Хорошей практикой считается объединение всех commit'ов ветки перед merge (это называется squash commit)
Не рекомендуется выполнять squash до ревью, так как объединение commit'ов создает совершенно новый commit, а значит все комментарии в PR потеряются или их будет трудно найти.
Выполняйте squash непосредственно перед слиянием, после исправления всех замечаний - В терминале смените ветку на master git checkout master
- Обновите репозиторий, выполнив команды
иgit pullgit fetch
Rebase vs Merge, разрешение конфликтов
В данном разделе рассмотрим разницу между rebase и merge, посмотрим как решать конфликты.
Merge и разрешение конфликтов
- Создадим новую ветку git checkout -b feature/merge-demo
- Внесем в файл
, добавив туда записьsrc/main/resources/application-dev.properties
(единственная запись на единственной строке)spring.application.name=DEVAPP - Создадим commit git add -A . && git commit -m "MERGE branch commit 1"
- Переключимся на ветку master git checkout master
- Внесем в файл
, добавив туда записьsrc/main/resources/application.properties
(единственная запись на единственной строке)spring.application.name=PRODAPP - Создадим commit и отправим изменения на сервер git add -A . && git commit -m "MASTER commit to master for merge branch" && git push origin master
- Переключаемся обратно на ветку feature/merge-demo git checkout feature/merge-demo
- Вносим изменения в файл
, добавив туда записьsrc/main/resources/application.properties
(также на первую строчку)server.port=8081 - Создадим commit git add -A . && git commit -m "MERGE branch commit 2"
- Отправим изменения на сервер git push origin feature/merge-demo
- Чтобы избежать конфликтов при слиянии PR (в будущем) необходимо периодически подгружать изменения из ветки
в нашу веткуmasterfeature/merge-demo - Выполняем команду
, получаем ошибку (конфликты)git merge master
Конфликт в одном файле
, где мы изменили одну и туже строку.src/main/resources/application.properties
Auto-merging src/main/resources/application.properties
CONFLICT (content): Merge conflict in src/main/resources/application.properties
Automatic merge failed; fix conflicts and then commit the result.
- Для решения конфликта необходимо открыть файл
в любом текстовом редактореsrc/main/resources/application.properties
Так выглядит файл, сверху -- это значение из текущей ветки
, а снизу изfeature/merge-demo
. Наша задача -- объединить файл и удалить разметку, которую сделал git.master
<<<<<<< HEAD
server.port=8081
=======
spring.application.name=PRODAPP
>>>>>>> master
- Устраняем конфликты, теперь файл выглядит так
Объединили строки и удалили лишние пустые строки.
spring.application.name=PRODAPP
server.port=8081
- Добавляем исправленный файл в индекс git add src/main/resources/application.properties
- Выполняем команду git merge --continue
- Откроется редактор в terminal для редактирования комментария к commit
редактироватьi
выйти из режима редактированияESC
сохранить и выйти:wq
- После редактирования процесс merge успешно окончен
[feature/merge-demo 33b39c1] Merge branch 'master' into feature/merge-demo
Rebase и squash
В данном разделе разрешение конфликтов рассмотрено не будет, потому что оно ничем не отличается от рассмотренного выше при merge.
Только вместо команды
необходимо будет использовать
.
Rebase
- Создадим новую ветку git checkout -b feature/rebase-demo
- Внесем в файл
, добавив туда записьsrc/main/resources/application-dev.properties
(неважно на какую строку)server.port=8081 - Создадим commit git add -A . && git commit -m "REBASE branch commit 1"
- Переключимся на ветку master git checkout master
- Внесем в файл
, добавив туда записьsrc/main/resources/application.properties
(в конец файла)ADDED FROM MASTER - Создадим commit и отправим изменения на сервер git add -A . && git commit -m "MASTER commit to master for rebase branch" && git push origin master
- Переключаемся обратно на ветку feature/rebase-demo git checkout feature/rebase-demo
- Создаем новый файл
в корне проектаinfo.txt - Создадим commit git add -A . && git commit -m "REBASE branch commit 2"
- Отправим изменения на сервер git push origin feature/rebase-demo
- Чтобы избежать конфликтов при слиянии PR (в будущем) необходимо периодически подгружать изменения из ветки
в нашу веткуmasterfeature/rebase-demo
Другими словами нужно сделать rebase ветки
наfeature/merge-demo
веткиHEADmaster - Выполняем команду git rebase master
Successfully rebased and updated refs/heads/feature/rebase-demo. - Перед выполнением последнего пункта, зайдите в web-интерфейс и посмотрите историю commit'ов в ветке
, сохраните хэши последних двухfeature/rebase-demo - Отправим изменения на сервер git push --force-with-lease origin feature/rebase-demo
Необходимо использовать флаг
для принудительной отправки изменений (force push), так как commit'ы были перестроены.--force-with-lease - Зайдите в web-интерфейс и посмотрите историю commit'ов в ветке
, добавился новый commit, а у двух поменялись хэши (потому что это новые commit'ы)feature/rebase-demo
Squash коммитов
Squash коммитов -- это объединение нескольких коммитов в один с целью сохранения истории репозитория более чистой и удобочитаемой.
В данном разделе нам понадобится ветка
из предыдущего пункта.
- Находясь в ветке
выполните команду создания новой веткиfeature/rebase-demogit checkout -b feature/squash-demo - Выполните команду
, изучите выводgit log --oneline
Нам необходимо сделать squash двух последних commit'ов
494d3ae (HEAD -> feature/squash-demo, origin/feature/rebase-demo, feature/rebase-demo) REBASE branch commit 2
e01a3a5 REBASE branch commit 1
9728b76 (origin/master, origin/HEAD, master) MASTER commit to master for rebase branch
...
- Выполняем команду git rebase -i HEAD~2
- В открывшемся редакторе измените pick на squash для второго commit'а, сохраните и закройте редактор
pick e01a3a5 REBASE branch commit 1
squash 494d3ae REBASE branch commit 2
- Откроется новый редактор для редактирования сообщения commit'а, объедините сообщения, сохраните и закройте редактор
squash commit 1&2
- Готово! Теперь история коммитов выглядит так (
)git log --oneline
43e7d68 (HEAD -> feature/squash-demo) squash commit 1&2
9728b76 (origin/master, origin/HEAD, master) MASTER commit to master for rebase branch
...
Теперь эту ветку можно отправить на сервер, используя force push (см. выше).
Fork и выставление PR в "чужой" публичный репозиторий
Когда вы хотите сделать исправление в opensource или просто другом (не вашем) проекте вам необходимо следовать определенным правилам, здесь мы рассмотрим как это делается.
- Найдите репозиторий в web-интерфейсе gitverse.ru и нажмите на кнопку
, название репозитория укажите любоеФорк - Нажмите Форкнуть репозиторий
- В форкнутом репозитории создайте ветку (см. выше раздел "Создание ветки")
- Внесите изменения, создайте commit и отправьте его на сервер (в свой форкнутый репозиторий)
- Через web-интерфейс сделайте Запрос, указав
оригинальный репозиторий (откуда был сделан форк)В ветку - Готово! :)
Работа с тегами
Работа с тегами не рассмотрена в рамках данного гайда, предлагается изучить данную тему самостоятельно: https://git-scm.com/book/ru/v2/Основы-Git-Работа-с-тегами