Домашни работи с git

Тази тема описва примерен workflow за разработване на домашно или курсов проект към курса, като се ползва мощта на git за да станат нещата удобни (ако и да е малко стряскащо сложно в началото :)).

Вижте също този видео туториал, където са показани всички стъпки по-долу.

Ако все още не сте теглили кода на нашия проект и не сте подкарвали компилация при вас, следвайте тези инструкции.

Ако вече имате кодът изтеглен, първо обновете вашето копие до официалните последни промени в github:

‣ TortoiseGIT: Git Sync » Pull (уверете се, че Local и Remote branches са "master")


‣ Command line:

git checkout master
git pull

Ако имате локални промени, които искате да запазите преди това - stash-нете си ги първо.

Ако съответното домашно има няколко групи и се изисква да решавате само 1 задача съгласно групата, която ви се пада по факултетен номер, вижте и тези инструкции.

Следва самият workflow:

  1. Ориентирайте се върху коя версия да почнете да работите. В указанията за конкретното домашно или курсов проект ще е написано изрично. За домашните, това обикновено е таг с име "homework«номер»". За да изтеглите точно тази версия (за да имате подходящата база, върху която да работите):

    ‣ TortoiseGIT: TortoiseGIT » Show Log. В лога намерете необходимия ви таг (оцветени са в жълто), давате десен клик върху него и "Reset master to this" » Mode: Hard.


    ‣ Command line: (заместете homeworkX с правилния tag)

    git reset --hard homeworkX
  2. Не е задължително, но е много удобно да си създадете branch, в който да си работите:

    ‣ TortoiseGIT: TortoiseGIT » Create branch... Тук въведете името на branch-а ви (именувайте го както желаете - примерно "homework4/task2"). Маркирайте цъкалката "Switch to new branch".


    ‣ Command line:

    git branch homework4/task2
    git checkout homework4/task2

    Идеята тук е, че можете да си работите кротко във вашия си branch, и винаги да можете да се върнете към master, да изтегляте нови промени (чрез switch/checkout). Също така, можете да работите по повече от една задача, като си ги държите в отделни branch-ове.

  3. Пишете решението си
  4. Commit-нете промените:

    ‣ TortoiseGIT: Git commit... -> "«името на вашия branch»". В commit log-а пишете каквото искате.


    ‣ Command line:

    git commit -m "My solution to this task..." -a
  5. Създайте .patch файлове с промените:

    ‣ TortoiseGIT: TortoiseGIT » Create patch serial...


    ‣ Command line: (заместете homeworkX с правилния tag)

    git format-patch homeworkX

    Ще се появят един или повече файла в директорията. Те са от вида 0001-Вашето-commit-съобщение.patch. Това са файловете с вашите промени (ако искате, проверете с текстов редактор какво точно се е включило в тях).

  6. Изпратете си решението чрез Moodle, като в изпратеното включете:
    1. Вашият(те) .patch файл(ове).
    2. Ако не сте реализирали цялото решение, пишете накратко какво сте направили и за какво очаквате точки -- особено, ако задачата по условие позволява да направите само част от нея. Разбира се, ние така или иначе ще я оценим, но ще се спести излишните питанки от вида "А точки за изискването ХХХ очакваш ли?"
  7. Ще се стараем да видим решението ви до няколко дни, като ще ви пиша отговор + точки (и евентуално съвети за корекции, ако нещо по решението ви има смисъл да се подобри).

Ако имате корекции или въпроси по целия този процес, не се колебайте да ги задавате тук :)

Comments

Понеже досега съм работил

Понеже досега съм работил само с TortoiseSVN, сигурно ще пада яко омазване с неговия брат костенурчо GIT :D, но трябва да се свиква.

Та въпроса ми е: Като създам нов branch, трябва ли да ми се създаде нова папка с този branch ?
Също така виждам, че при SVN като ъпдейтнах ми се появи новата папка tags/homework4, докато при GIT не се виждат - имам само trinity/.. - и вътре файловете към проекта ?

Та направих "Стъпка 2" и сега как да проверя дали си работя в моя клон или не ?

Edit: Работя под Windows
Edit 2: Сега видях, че като дам дясно копче и имам да избера Git Commit -> "името_на_моя_клон". Предполагам, че това значи че в момента си работя върху клона, който съм създал ?

За да видиш в кой branch си

Не се създава папка. Данните от branch-овете се пазят "вътрешно" - при прескачане от един в друг, git ти презаписва working copy-то, така че то да отразява branch-а, който си избрал.

За да видиш в кой бранч си в момента - най-лесно е така - десен бутон в експлорър и виж какво пише в контекстното меню при TortoiseGIT. Ако там има "Git commit -> 'master'" - значи си в master. Ако е името на твоя бранч - значи си на правилното място.

Иначе да - learning curve-а е леко депресиращ в началото, но заради удобството и лекотата, с която това нещо борави с branch-ове, си заслужава :]

Още едно въпросче относно

Още едно въпросче относно GIT:

Сега, за да си сваля отново финалната версия на рейтрейсъра, предполагам, че първо трябва да switch-на към master (за да излеза от моя branch). Имам 2 опции за master - "master" и "remotes/origin/master". Кое трябва да избера от двете ?

master трябва да е. Ако след

master трябва да е.
Ако след checkout-а, все още нямаш актуалната версия на кода, трябва да pull-неш актуалната версия.

Commit my branch

На стъпка 4, където трябва да си комитна промените ми иска да си въведа User и email.
След като ми отвори прозореца TortoiseGit-> Git има Config Source : Effective , Local, Global и System, като на мен ми е избрано Effective, но не ми дава да въдеда име и имейл.
Трябва ли да избера някое от другите три и има ли значение кое, защото ако ги избера и махна отметките inherit ми дава да въведа Name, Email и Signing Key ID?

local/global

Ами трябва да въведеш само Name и Email. Опциите local и global са дали това име/email да се ползва само за локалното git repo, което си изтеглил, или за всички git repositories, които имаш на тази машина. Ако навсякъде се аутентикираш с едни и същи име и email, или нямаш друг git код на компютъра си, тогава сложи най-добре на global.

Git - branches

Днес нещо омазах нещата с git и направо изтеглих репозиторито наново.
Но сега виждам, че през графичния интерфейс не мога да се прехвърля на никой от старите branch-ове. Има ли някакъв начин това да стане или вече са изгубени :) ?

Ако си изтрил старото репо -

Ако си изтрил старото репо - няма връщане. Ако не си - по-скоро се върни на него и си го отмажи. Принципно git reset (hard) на актуалния master и би следвало да си ок.

Ами изтрих го, но си пазя

Ами изтрих го, но си пазя пачовете, предполагам, че те ще ми свършат работа.