gitverse new year логотип

gitverse-demo-hello2

Форк
0

README.md

Gitverse

Основы git, работа с gitverse. Летняя цифровая школа Сбера 2024.

Основные ссылки

Настройка рабочего места

Ссылка по генерации 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

  1. В терминале выполнить команду
    ssh-keygen -t ed25519 -C "your-mail@yaya.ru"
    1. Ваш email должен совпадать с тем, который указан в аккаунте gitverse.
    2. Задайте имя ключа
      id_ed25519_gitverse
      (можно любое)
    3. Пароль можно не задавать (нажмите Enter).
  2. Исправьте ваш файл ~/.ssh/config, добавив в начало файла следующую конструкцию
# GitVerse Host gitverse.ru Hostname gitverse.ru AddKeysToAgent yes UseKeychain yes IdentityFile ~/.ssh/id_ed25519_gitverse
  1. В терминале выполнить команду
    cat ~/.ssh/id_ed25519_gitverse.pub
    и содержимое скопировать в буфер обмена
  2. На портале gitverse.ru перейти в Настройки > SSH ключи и добавить свой ключ (содержимое буфера обмена из пункта выше)

Все готово к работе, поехали дальше :)

Создание репозитория

  1. Логинимся на портал gitverse.ru
    1. Для приватности, рекомендуется в Настройках вашего Профиля установить флажок "Скрыть ваш email: ..."
  2. Сверху выбираем Добавить > Новый репозиторий
  3. При необходимости перенести репозиторий из других сервисов, выберите "Перенести сюда" (нам это не нужно)
  4. Указываем название репозитория
    gitverse-demo-hello
  5. В описании указываем
    Демо проект для gitverse
    (или что-то другое, например
    я люблю gitverse :)
    )
  6. Ниже выбираем опцию
    Публичный
    (при необходимости, в будущем, вы можете выбирать опцию
    Приватный
    , чтобы ваш проект был доступен только по приглашению)
  7. Отмечаем галочкой
    Добавить файл README.md
  8. Отмечаем галочкой
    Добавить .gitignore
    , из списка выбираем
    Java
    ,
    Maven
  9. Нажимаем кнопку
    Создать репозиторий
  10. У вас появился экран с вашим репозиторием :)

Работа с репозиторием

У вас должна быть установлена утилита git. Для установки на Mac выберите одну из опций:

Для проверки выполните команду

git config --list --show-origin
, которая покажет вам глобальные и локальные конфигурации git.

  1. Для начала нужно клонировать созданный ранее репозиторий:
    1. На портале gitverse.ru, на странице репозитория
      gitverse-demo-hello
      найдите кнопку
      Клонировать
      , нажмите ее, выберите
      SSH
    2. В терминале перейдите в папку, где будет ваш репозиторий
    3. Выполните команду
      git clone ssh://git@gitverse.ru:2222/(username)/gitverse-demo-hello.git
      (замените
      (username)
      на ваш login, который указан под именем на портале gitverse.ru)
  2. Клонируйте себе также репозиторий
    git clone ssh://git@gitverse.ru:2222/nkozlov/gitverse-demo-example.git
    (там содержится demo приложение)
  3. Скопируйте все файлы (кроме README.md) и папки из директории
    gitverse-demo-example/
    в корень
    gitverse-demo-hello/
  4. Перейдите в папку
    gitverse-demo-hello/
  5. Установите правильно имя и 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

  1. В терминале заходим в папку
    gitverse-demo-hello
  2. Выполняем команду
    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
  1. Выполняем команду
    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)
  1. Добавим все наши изменения в индекс (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
  1. Мы видим лишние файлы
    .DS_Store
    (системные файлы macOs), которые попали в index, чтобы их удалить у нас есть несколько опций
    1. Выполнить команду
      git rm --cache **/.DS_Store
      , теперь
      git status
      показывает, что все файлы
      .DS_Store
      находятся в
      Untracked files
    2. Выполнить команду
      git reset HEAD
      (чтобы очистить индекс), а затем выполнить команду
      git add --all . -- ':!**/.DS_Store' ':!.DS_Store'
    3. Добавить в файл
      .gitignore
      .DS_Store
      и выполнить изначальную команду
      git add -A .
      (рекомендуемый способ)
  2. Создаем коммит командой
    git commit -m "It's first commit, I love gitverse :)"

    Теперь
    git status
    выдает сообщение
    Your branch is ahead of 'origin/master' by 1 commit.
    , а
    git log
    показывает новый commit
    1. Если потребуется изменить автора commit (последнего), то выполните команду
      git commit --amend --author "Ivan Petrov <myEmail@ya.ru>" --no-edit

      Это может возникнуть, если вы забыли поправить git config или поправили его неверно
    2. Если потребуется изменить дату commit (последнего) на текущую, то выполните команду
      GIT_COMMITTER_DATE="$(date)" git commit --amend --no-edit --date "$(date)"
  3. Давайте отправим изменения на сервер (push)
    git push origin master
  4. Зайдем на портал gitverse.ru, в репозиторий
    gitverse-demo-hello
    , просмотрим изменения в репозитории, зайдем в commit, просмотрим файлы

Идем дальше!

Работа с ветками, PR

В данном разделе мы рассмотрим процесс создания веток, выставления PR, правки PR и merge в master. А также узнаем как делать squash commit (объединение коммитов). Для начала необходимо узнать основные правила именования веток в Git (в зависимости от flow они могут отличаться):

  • master
    : основная ветка в репозитории, содержит стабильную версию кода
  • develop
    : используется в GitFlow, основная ветка для разработки, все новые изменения в коде сначала попадают сюда
    Пример:
    develop
  • feature
    : ветки для разработки новой функциональности
    Пример:
    feature/TASK-32_vault
  • hotfix
    : ветки для исправления дефектов Пример:
    hotfix/SUPPORT-554

Создание ветки

  1. Создадим feature ветку и сразу переключимся на нее
    git checkout -b feature/firstBranch

    Ветка создается в локальном репозитории и сервер о ней ничего не знает, пока не выполнить команду
    git push ...
  2. Выполним команду
    git branch -a
    , чтобы увидеть все ветки репозитория
* feature/firstBranch master remotes/origin/HEAD -> origin/master remotes/origin/master
  1. Внесем изменения в существующий файл
    src/main/java/ru/sberbank/corpunivers/gitverse/controller/GitverseHelloController.java
    , заменив строку
    Hello from Gitverse!
    на
    Я люблю Gitverse!
  2. Создадим новый файл
    src/main/resources/application-dev.properties
    , оставим его пустым
  3. Выполним команду
    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")
  1. Добавляем файлы в 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
  1. Создаем 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
  1. Отправляем изменения на сервер
    git push origin feature/firstBranch
  2. Обновляем страницу на gitverse.ru c открытым репозиторием, в выпадающем списке, где написано
    master
    появилось новое значение
    feature/firstBranch
  3. Перейдите в ветку на портале gitverse.ru и посмотрите свои изменения через web-интерфейс
    1. Рядом с выпадающим списком с ветками, вы можете нажать на
      Коммиты: 3
      (обратите внимание, что в
      maser
      Коммиты: 2
      , наша новая ветка опережает
      master
      на 1 commit)
      Откроется таблица, в строке с вашим commit, справа будет хэш, нажмите на него и сможете просмотреть изменения через web-интерфейс

Создание PR и работа с ним

PR - это pull request, который необходимо сделать, когда вы хотите влить изменения из одной ветки в другую, как в нашем примере из

feature/firstBranch
в
master
.

  1. На портале gitverse.ru на странице репозитория вы находитесь на вкладке
    Код
    , перейдите на вкладку
    Запросы
  2. Нажмите
    Создать новый запрос
  3. Меняем
    Из ветки
    на
    feature/firstBranch
    , а
    В ветку
    должно быть значение
    master
  4. Поле
    Название
    оставляем без изменений
    На коммерческих проектах здесь указывают номер тикета и краткое название
  5. Проверяем количество коммитов и раздел
    Измененные файлы
  6. Нажимаем кнопку
    Создать запрос
    , PR создан, на экране отрылся
  7. Здесь вы можете добавить Ревьюеров, оставить комментарии к коду, вести обсуждения
  8. Допустим вам дали замечание к коду и нужно поправить ваше сообщение
    1. В той же ветке замените сообщение
      Я люблю Gitverse!
      на
      Я люблю Gitverse, честно!
    2. Выполните последовательно команды
      git add -A .
      ,
      git commit -m "I have fixed my fault"
      ,
      git push origin feature/newLines
    3. Теперь в web-интерфейсе вашего PR коммитов стало 2, а внесенные изменения видны на вкладе
      Измененные файлы
  9. На вкладке
    Обсуждение
    нажмите
    Создать коммит на слияние
    , при желании можете удалить ветку
    Если вы удалите ветку, то в терминале напишите
    git fetch
    , чтобы обновить локальные данные об удаленном репозитории
  10. Перейдите на вкладку
    Код
    , выберите ветку
    master
    , нажмите на
    Коммиты: 5
    , убедитесь, что все ваши все ваши commit'ы присутствуют
    Также вы видите еще один commit, который называется merge-commit и содержит все изменения после слияния веток. Чтобы его избежать необходимо сделать rebase перед merge
  11. Хорошей практикой считается объединение всех commit'ов ветки перед merge (это называется squash commit)
    Не рекомендуется выполнять squash до ревью, так как объединение commit'ов создает совершенно новый commit, а значит все комментарии в PR потеряются или их будет трудно найти.
    Выполняйте squash непосредственно перед слиянием, после исправления всех замечаний
  12. В терминале смените ветку на master
    git checkout master
  13. Обновите репозиторий, выполнив команды
    git pull
    и
    git fetch

Rebase vs Merge, разрешение конфликтов

В данном разделе рассмотрим разницу между rebase и merge, посмотрим как решать конфликты.

Merge и разрешение конфликтов

  1. Создадим новую ветку
    git checkout -b feature/merge-demo
  2. Внесем в файл
    src/main/resources/application-dev.properties
    , добавив туда запись
    spring.application.name=DEVAPP
    (единственная запись на единственной строке)
  3. Создадим commit
    git add -A . && git commit -m "MERGE branch commit 1"
  4. Переключимся на ветку master
    git checkout master
  5. Внесем в файл
    src/main/resources/application.properties
    , добавив туда запись
    spring.application.name=PRODAPP
    (единственная запись на единственной строке)
  6. Создадим commit и отправим изменения на сервер
    git add -A . && git commit -m "MASTER commit to master for merge branch" && git push origin master
  7. Переключаемся обратно на ветку feature/merge-demo
    git checkout feature/merge-demo
  8. Вносим изменения в файл
    src/main/resources/application.properties
    , добавив туда запись
    server.port=8081
    (также на первую строчку)
  9. Создадим commit
    git add -A . && git commit -m "MERGE branch commit 2"
  10. Отправим изменения на сервер
    git push origin feature/merge-demo
  11. Чтобы избежать конфликтов при слиянии PR (в будущем) необходимо периодически подгружать изменения из ветки
    master
    в нашу ветку
    feature/merge-demo
  12. Выполняем команду
    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.
  1. Для решения конфликта необходимо открыть файл
    src/main/resources/application.properties
    в любом текстовом редакторе
    Так выглядит файл, сверху -- это значение из текущей ветки
    feature/merge-demo
    , а снизу из
    master
    . Наша задача -- объединить файл и удалить разметку, которую сделал git.
<<<<<<< HEAD server.port=8081 ======= spring.application.name=PRODAPP >>>>>>> master
  1. Устраняем конфликты, теперь файл выглядит так
    Объединили строки и удалили лишние пустые строки.
spring.application.name=PRODAPP server.port=8081
  1. Добавляем исправленный файл в индекс
    git add src/main/resources/application.properties
  2. Выполняем команду
    git merge --continue
  3. Откроется редактор в terminal для редактирования комментария к commit
    1. i
      редактировать
    2. ESC
      выйти из режима редактирования
    3. :wq
      сохранить и выйти
  4. После редактирования процесс merge успешно окончен
    [feature/merge-demo 33b39c1] Merge branch 'master' into feature/merge-demo

Rebase и squash

В данном разделе разрешение конфликтов рассмотрено не будет, потому что оно ничем не отличается от рассмотренного выше при merge. Только вместо команды

git merge --continue
необходимо будет использовать
git rebase --continue
.

Rebase

  1. Создадим новую ветку
    git checkout -b feature/rebase-demo
  2. Внесем в файл
    src/main/resources/application-dev.properties
    , добавив туда запись
    server.port=8081
    (неважно на какую строку)
  3. Создадим commit
    git add -A . && git commit -m "REBASE branch commit 1"
  4. Переключимся на ветку master
    git checkout master
  5. Внесем в файл
    src/main/resources/application.properties
    , добавив туда запись
    ADDED FROM MASTER
    (в конец файла)
  6. Создадим commit и отправим изменения на сервер
    git add -A . && git commit -m "MASTER commit to master for rebase branch" && git push origin master
  7. Переключаемся обратно на ветку feature/rebase-demo
    git checkout feature/rebase-demo
  8. Создаем новый файл
    info.txt
    в корне проекта
  9. Создадим commit
    git add -A . && git commit -m "REBASE branch commit 2"
  10. Отправим изменения на сервер
    git push origin feature/rebase-demo
  11. Чтобы избежать конфликтов при слиянии PR (в будущем) необходимо периодически подгружать изменения из ветки
    master
    в нашу ветку
    feature/rebase-demo

    Другими словами нужно сделать rebase ветки
    feature/merge-demo
    на
    HEAD
    ветки
    master
  12. Выполняем команду
    git rebase master

    Successfully rebased and updated refs/heads/feature/rebase-demo.
  13. Перед выполнением последнего пункта, зайдите в web-интерфейс и посмотрите историю commit'ов в ветке
    feature/rebase-demo
    , сохраните хэши последних двух
  14. Отправим изменения на сервер
    git push --force-with-lease origin feature/rebase-demo

    Необходимо использовать флаг
    --force-with-lease
    для принудительной отправки изменений (force push), так как commit'ы были перестроены.
  15. Зайдите в web-интерфейс и посмотрите историю commit'ов в ветке
    feature/rebase-demo
    , добавился новый commit, а у двух поменялись хэши (потому что это новые commit'ы)

Squash коммитов

Squash коммитов -- это объединение нескольких коммитов в один с целью сохранения истории репозитория более чистой и удобочитаемой.
В данном разделе нам понадобится ветка

feature/rebase-demo
из предыдущего пункта.

  1. Находясь в ветке
    feature/rebase-demo
    выполните команду создания новой ветки
    git checkout -b feature/squash-demo
  2. Выполните команду
    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 ...
  1. Выполняем команду
    git rebase -i HEAD~2
  2. В открывшемся редакторе измените pick на squash для второго commit'а, сохраните и закройте редактор
pick e01a3a5 REBASE branch commit 1 squash 494d3ae REBASE branch commit 2
  1. Откроется новый редактор для редактирования сообщения commit'а, объедините сообщения, сохраните и закройте редактор
squash commit 1&2
  1. Готово! Теперь история коммитов выглядит так (
    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 или просто другом (не вашем) проекте вам необходимо следовать определенным правилам, здесь мы рассмотрим как это делается.

  1. Найдите репозиторий в web-интерфейсе gitverse.ru и нажмите на кнопку
    Форк
    , название репозитория укажите любое
  2. Нажмите
    Форкнуть репозиторий
  3. В форкнутом репозитории создайте ветку (см. выше раздел "Создание ветки")
  4. Внесите изменения, создайте commit и отправьте его на сервер (в свой форкнутый репозиторий)
  5. Через web-интерфейс сделайте Запрос, указав
    В ветку
    оригинальный репозиторий (откуда был сделан форк)
  6. Готово! :)

Работа с тегами

Работа с тегами не рассмотрена в рамках данного гайда, предлагается изучить данную тему самостоятельно: https://git-scm.com/book/ru/v2/Основы-Git-Работа-с-тегами

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.