В данном проекте используется система контроля "Git"
Она будет спользоваться для версионирования, работы с удаленным репозиторием и хранением изменений.
В данном пособии будет расказано о том, как работать с Git в контексте работы над проектом. Будут расказаны общие шаги.
Если Git еще не установлен на вашем ПК, то это можно сделать по ссылке: https://git-scm.com/download/win
Список удобных UI инструментов для работы с Git:
- Intelij - все IDE от JetBrains обладают очень удобным средством для работы с Git. Все крайне интуитивно, понятно и удобно. Используя этот способ, ошибится сложнее всего.
- VS Code - текстовый редактор, с функцией работы с Git. Стоит добавить пару плагинов, чтобы работать было проще (Рекомендую Git Graph и Git Lens). Но все равно, куда хуже и менее понятный, нежели InteliJ
- Fork - классный UI инструмент для работы с Git. Имеет приятный интерфейс, большой набор возможностей. Лично я с ним не работал, но все рекомедуют.
- Sublime Merge - Git инструмент от создателей легендарного Sublime Text. Маленький, приятный, быстрый.
Работать можно так же из терминала. Навыки работы в терминале лишними не будут. А еще они вызовут уважение коллег и вы сможете изображать хакера как в голливудских фильмах. И пускай этот способ в 10 раз медленнее и подвержен ошибкам больше, чем что либо.
Для начала работы над проектом надо склонировать репозиторий.
Делается это командой git clone
URL нашего проекта: https://github.com/SUAI-TaskPlanner-Contest/TaskPlanner.git
Выполняется это следующей командой в терминале:
git clone https://github.com/SUAI-TaskPlanner-Contest/TaskPlanner.git
Данная команда загрузит удаленный репозиторий из GitHub.
Если вы исползуете git впервые, то понадобится установить Email и имя пользователя.
Так же, можно склонировать репозиторий средствами IDE
Для клонировния посредством IDE необходимо будет авторизоваться в GitHub
Для начала, нужно чтобы задача была issue.
Потом необходимо создать ветку в задаче:
Название ветки должно быть строго латиницей
Данным способом ветка создается привязанной к задаче
Для того, чтобы работать над задачей в данной ветке, необходимо взять её с удаленного репозитория и переключить локальный git на неё. Делается это следующими коммандами:
Обновляет список локальный веток
git fetch origin
Переключает ветку на выбранную:
git checkout 11-create-сontributing-file
Теперь можно работать!
Для отправки изменений необходимо сделать следующее:
- Закоммитить изменения
- Сделать rebase
- Запушить изменения
Второй пункт является опциональным, зависит от ситуации
- добавить созданные файлы в git, чтобы он начал их отслеживать
Добавление выбранного файла
git add "название файла"
Добавление всех созданных файлов
git add *
В InteliJ можно сделать предыдущее действие на всю папку
Коммит файлов выполняется командой
git commit -m "Сообщение к коммиту"
Если нужно изменить предыдущий коммит, то нужно сделать commit ammend
git commit -a -m "Сообщение к коммиту"
Так же при помощи ammend, можно изменять сообщение последнего коммита
rebase нужен в случае, если в ветку main были добавлены коммиты другими участниками команды. В этом случае, ваша ветка будет отставать от main удаленной. Её можно будет запушить, но влить в main будет нельзя.
Есть два пути:
- Сделать merge
- Сделать rebase
Первый путь сложный, тернистый и это вызовет сложности, так как будет по сути две ветки, вместо одной. Как замену этого, можно сделать так, чтобы ваша ветка брала начало не от того коммита, что был при создании ветки, а от самого последнего. По сути, удалить ветку, запомнив все ваши коммиты, создать свежую, и скопировать коммиты туда.
rebase весьма сложная команда. Подробно про нее можно прочитать здесь
Но, к счастью для всех, во всех IDE, есть встроенное средство для этого:
Остается только выбрать на какую ветку сделать rebase. Это нужно сделать на main ветку, так как ветка будет вливаться в неё.
Во время rebase, очень часто возникают конфликты. Конфликты, как и в жизни между людьми, надо решать. В этом случае, в IDE показывается окно с тремя секциями. Слева ваш код что вы хотите добавить, справа тот код, что есть remote-ветке (или в которую хотите влить изменения), и по середине код, который будет принят. IDE подсвечивает места, где конфликты. Конфликт это когда Git не может слить два файла. Это бывает что в одной и той же строке написано разное. Для этого надо написать в окно посередине нужный вариант. Думаю что в нашем случае, это будет довольно редко.
Может быть такое, что есть много коммитов на подобие "Save", "Save this stuff", "abcd" и других, который просто для того чтобы не потерять работу. Перед отправкой, их надо склеить в один коммит, так как ревьюер (тот кто будет искать ошибки и делать bonk), будет смотреть самый последний (иначе будет дико неудобно). Делается это в IDE Jetbrains парой кликов, (правая кнопка мыши по выбранным коммитам и squash), но в терминале и VScode это делать неудобно. Ссылка: https://htmlacademy.ru/blog/git/how-to-squash-commits-and-why-it-is-needed
После этой операции, можно сказать что ветка готова к отправке
Пришло время показать миру (нашей команде), что вы сделали. Или просто сохранить это, чтобы случайно удалив локально свою работу, не потерять её. А ещё, чтобы балуясь с GIT, не удалить её. У меня это было раза 3.
Есть два способа:
- Обычный push
git push TaskPlanner "название локальной ветки":"название remote ветки"
Данная команда отправляет на удаленный репозиторий коммиты из выбранной вами ветки. Самая простая команда.
- Force push
Игрушка дьявола
Команда, на сколько необходимая, на сколько опасная
git push TaskPlanner "название локальной ветки":"название remote ветки" --force
Данная команда делает тоже самое, что и предыдущая. Но с большим отличием. Обычно push добавляет в remote ветку коммиты из вашей локальной ветки. Для этого необходимо, что бы ветки были синхронизированны (имеют начало в одном и том же коммите, и имеют одни и те же коммиты). Но после rebase, ваша ветка будет иметь начало в другом коммите. Поэтому обычный push будет невозможен.
Опция --force
полностью ЗАМЕНИТ remote ветку на ту, что у вас локально. Это самый простой способ разрешить конфликты веток. Стоит обратить внимание, что ВСЕ коммиты что были в remote ветке, что не было у вас, пропадут. Они остануться только локально у того, кто их делал. Поэтому, если над задачей работают двое, надо быть внимательным, чтобы не удалить так работу своего товарища. Нервные клетки, как и код, удаленный форспушем, не восставливаются.
После всех этих действий, можно сказать что ваш код отправлен на удаленный репозиторий, в GitHub. Можно было бы вас проздравить, но вас ждет вторая часть эпопеи, описанная в руководстве по оформлениюю merge request-ов.