-
"Официална" git книжка Препоръчвам (в изброения ред) главите 1, 2, 3, 10 и потенциално после и 8.1, 7.1, 7.2, 7.3, 7.6, 7.7, 7.10, 8.2.
-
https://ohshitgit.com - "обърках нещо, помощ 🥺"
Инсталирайте git
:
Препоръчвам също така и да си направите ssh
ключ и да ползвате "ssh
клониране"/менежиране на отдалеченото хранилище (става най-лесно, използвайки споменатото по-долу ssh клониране
).
Инструкции за генериране на ключ
Инструкции за слагане на ключа в GitHub
Създайте вашето хранилище:
Навигирайте до страницата на заданието. Там ще намерите бутон за "приемане" на "заданието" (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"
Когато приключи срокът за домашното може да спрете да бутате нови неща в хранилището (а и няма и да гледам неща бутнати след крайния срок, освен ако нямате някаква основателна причина да не сте успели да направите всичко до преди крайният срок).
След като се появи ново домашно (или проект), може да започнете отначало стъпките за решаване му.
Тук ще опиша най-често нужните стъпки, които може да ви се налага да правите, за да решите домашно.
# зачистваме всички сегашни не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 докато не решим задачите...
Опитах се да включа новите промени от часа (от автоматичният 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
до 2.23 или по-нов.
Алтернативно, можете да замените:
git restore <files>
->git checkout <files>
git switch <branch>
->git checkout <branch>
git switch --create <branch>
->git checkout -b <branch>
Тъй като git checkout
прави много неща, са решили да отделят "менежиране на файлове" от "сменяне на клонове" частите една от друга.
За повече информация вижте тук