Skip to content

Latest commit

 

History

History
140 lines (97 loc) · 10.3 KB

GIT_INSTRUCTIONS.md

File metadata and controls

140 lines (97 loc) · 10.3 KB

Инструкции за ползване на git за нуждите на курса

Ресурси за git

Предварителни стъпки

Инсталирайте git:

Препоръчвам също така и да си направите ssh ключ и да ползвате "ssh клониране"/менежиране на отдалеченото хранилище (става най-лесно, използвайки споменатото по-долу ssh клониране).

Инструкции за генериране на ключ

Инструкции за слагане на ключа в GitHub

Основно "In Class" хранилище

Създайте вашето хранилище:

Навигирайте до страницата на заданието. Там ще намерите бутон за "приемане" на "заданието" (inclass нещата съм ги моделирал като домашно без краен срок) - той автоматично ще си създаде копие на репото, в което аз мажа по време на час.

Клонирайте вашето хранилище:

# ssh клониране
git clone [email protected]:fmi-fp-lab/inclass-2024-25-ВАШЕТО_GITHUB_ИМЕ.git
# HTTPS клониране
git clone https://github.com/fmi-fp-lab/inclass-2024-25-ВАШЕТО_GITHUB_ИМЕ.git

Tip

Може да си прекръстите локалната папка да не се казва inclass-2024-25-ВАШЕТО_GITHUB_ИМЕ

В това хранилище можете спокойно да си мажете и commit-push-вате на master, а при ъпдейт от моя страна (най-често в края на лекционната част на упражнението и/или ако нещо съм осрал и съм пушнал следварително, че да го оправя) аз ще ви пусна автоматични pull request-и, които можете (вие или аз, според зависи) да си merge-нете във вашите хранилища, че да придобиете достъп до новите нещица (и оптимално запазвайки старите си ваши промени, най-често по .hs файловете за съответното упражнение).

Домашни и проект

Абсолютно същата идея и процес както при In Class хранилището, само дето в дискорда ще потърсите линк за съотвеното задание за въпросното домашно (или проект). Оттам нататък процесът е същият.

Единствена разлика е, че GitHub автомагически ще ви отвори pull request-и, в които ще можем да си комуникираме по вашият код, като е хубаво този процес да почне възможно най-рано, че да може по-малко време да сте забили ако нещо не върви (TLDR - често commit-вайте и push-вайте)

Note

Кодът push-ван по време на работа, не е финалното предаване на домашното и е напълно очаквано, преди крайния срок за домашното, да ви пиша коментари по pull request-а, на които вие да отговаряте или със собствени ваши коментари, или оправяйки кода си.

Най-често тези коментари са

  • "яко, защото X"
  • "това е ок и ще ти дам точки за него, но може и по-добре, защото X"
  • "това не е правилно и няма да получиш точки за него, защото X"

Когато приключи срокът за домашното може да спрете да бутате нови неща в хранилището (а и няма и да гледам неща бутнати след крайния срок, освен ако нямате някаква основателна причина да не сте успели да направите всичко до преди крайният срок).

След като се появи ново домашно (или проект), може да започнете отначало стъпките за решаване му.

TLDR

Тук ще опиша най-често нужните стъпки, които може да ви се налага да правите, за да решите домашно.

# зачистваме всички сегашни неcommit-нати промени
git restore .
# отиваме на master
git switch master
# ...програмиране...
# решаваме че сме направили достатъчно промени за commit, например решили сме една задача
git add "файловете обвързани с нашите промени"
# правим commit, опитваме се да пишем хубаво съобщение
git commit
# бутаме си промените от сегашния клон в отдалеченото хранилище
# -u origin HEAD частта обвързва сегашния клон с "еквивалента" му в отдалеченото хранилище
# това е нужно само първият път в който push-ваме, след това git push e достатъчно
git push -u origin HEAD
# ...повтаряме процеса add-commit-push докато не решим задачите...

FAQ

Опитах се да включа новите промени от часа (от автоматичният PR), но GitHub ми казва, че "има конфлики". Какво да правя?

За най-сигурно - кажете ми първо, може да е проблем от моя страна. Може да дискуритаме проблема на място, в кордата или пък директно във въпросият автоматичен PR.

Note

Вероятно няма да стигнем до ситуация, в която да ви трябва написаното по-долу, но съм го оставил за пълнота.

Ако аз съм бутнал нещо по домашното, по което сте пипали и вие, git е възможно да каже че има "конфликти" - промени по файлове, които няма как автоматично да оправи. Например:

-- оригинален текст
f :: Int -> Int

-- при вас
f :: Integer -> Integer

-- в master
f :: Char -> Char

В този слуачай, git ще ви покаже и двата варианта (заедно с текстови индикатор кои промени откъде идват) и ще ви помоли да редактирате текста, оставяйки оставите вариант на кода, който ви устройва (както и да махнете текстовите индикатори за промени). Например може да решите че или искате да разкарате вашата версия (оставяйки само f :: Char -> Char), или искате да смесите двете версии (f :: Char -> Integer).

Няма общ алгоритъм за това - какво трябва да оставите от двете промени е изцяло контекстно зависимо.

За конфликтите, препоръчвам (по принцип, не само за курса) да си пуснете т.нар. three-way diff настройка:

git config --global merge.conflictstyle diff3

която казва на git да показва и оригиналната версия, а не само "вашата" и "другата".

git restore/git switch не работят!

Обновете си git до 2.23 или по-нов.

Алтернативно, можете да замените:

  • git restore <files> -> git checkout <files>
  • git switch <branch> -> git checkout <branch>
  • git switch --create <branch> -> git checkout -b <branch>

Какво са git restore/git switch?

Тъй като git checkout прави много неща, са решили да отделят "менежиране на файлове" от "сменяне на клонове" частите една от друга. За повече информация вижте тук