Skip to content

Git гране

У систему Git репозиторијума грана (енгл. branch) представља нову (засебну) верзију главног репозиторијума.

Зашто би правио копију репозиторијума у засебној грани?

Нека се у репозиторијуму налази твоја веб апликација и нека веб дизајнер треба да преправи њен дизајн. Ако не користиш Git, једини начин је да направиш копију свих фајлова и предаш их дизајнеру – не смеш да пустиш дизајнера да ради на “живој” верзији веб апликације. Док он мења дизајн, теби клијент јавља да постоји грешка у функционалности. Ти у међувремену копираш апликацију, исправљаш ту грешку, а веб дизајнер завршава посао и враћа ти фајлове са измењеним дизајном. Које је сада стање? Жива верзија апликације има грешку у функционалности и стари дизајн, у твојој верзији веб апликације са старим дизајном је исправљена грешка у функционалности, док верзија од веб дизајнера има исправљен дизајн и има грешку у функционалности. Сада треба да упоредиш сваки фајл са сваким у свим верзијама веб апликације, видиш шта си ти мењао, видиш шта је дизајнер мењао, покушаш да уклопиш твоје промене у односу на промене у дизајну итд. Такав задатак је чисто губљење времена и постаје скоро немогућ у било ком већем софтверском пројекту.

С друге стране, у истој ситуацији, ако користиш Git, дизајнеру креираш грану dizajn на којој он врши измене у дизајну. Када је уочена грешка у функционалности себи креираш грану otklanjanje_greske. Када завршиш са отклањањем грешке спојиш грану otklanjanje_greske на главну грану. Када дизајнер заврши са преправком дизајна, спојиш грану dizajn на главну грану (са упозорењем да је већ било измена на главној грани). Сада се на главној грани налази кôд са исправљеном грешком у функционалности и са преправљеним дизајном. У сваком тренутку је видљиво шта је и када је промењено на главној грани, а спајање споредних грана на главну грану је аутоматизовано и не одузима време.

Значи, гранање у Git систему ти омогућавају да радиш на различитим деловима пројекта, односно споредним гранама, без утицаја на главну грану. Када се посао заврши, споредне гране можеш лако спојити на главну грану. Лако можеш прелазити између грана и радити на различитим деловима пројекта тако да се они међусобно не мешају.

Креирање нове гране

Нека се у директоријуму C:\Projekat налази Git репо са три фајла, као у претходном примеру:

index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" type="text/css" href="style.css">
    <title>My First Web Page</title>
</head>
<body>
    <p>Hello, World!</p>
    <p>Novi pasus teksta...</p>
</body>
</html>

style.css:

body {
    font-family: Consolas, monospace;
    background-color: #000000;
    margin: 0;
    padding: 10px;
}
  
p {
    color: #4AF626;
}

и README.md:

# Git tutorijal

Ovaj repozitorijum je kreiran za Hello, World! **Git tutorijal**.

Velimir Radlovački
Školski centar "Nikola Tesla"
Vršac

Novembar 2023.

Нека, на пример, дизајнер треба да се убаци слике на сајт модификовањем index.html фајла. Не желиш да допустиш дизајнеру да модификује главну грану, па му креираш грану dizajner-slike:

PS C:\Projekat> git branch dizajner-slike

Можеш проверити да ли је грана креирана уносом команде:

PS C:\Projekat> git branch
  dizajner-slike
* master

Звездица поред гране ти говори која је тренутно активна грана.

Промена активне гране

На грану dizajner-slike прелазиш уносом команде…

PS C:\Projekat> git checkout dizajner-slike
Switched to branch 'dizajner-slike'

…што опет можеш проверити уносом команде:

PS C:\Projekat> git branch
* dizajner-slike
  master

Сада можеш вршити измене на сајту без бојазни да ћеш променути нешто на главној грани. Унеси команду:

PS C:\Projekat> code .

и убаци слику на сајт модификовањем index.html фајла:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" type="text/css" href="style.css">
    <title>My First Web Page</title>
</head>
<body>
    <p>Hello, World!</p>
    <p>Novi pasus teksta...</p>
    <a title="Brian Kernighan, 1978, CC BY-SA 3.0">
        <img width="640" alt="Hello World" src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/21/Hello_World_Brian_Kernighan_1978.jpg/256px-Hello_World_Brian_Kernighan_1978.jpg">
    </a>
</body>
</html>

Сачувај промене. Провери статус, стејџуј и комитуј промене:

PS C:\Projekat> git status
On branch dizajner-slike
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:   index.html

no changes added to commit (use "git add" and/or "git commit -a")
PS C:\Projekat> git add --all
PS C:\Projekat> git status
On branch dizajner-slike
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   index.html

PS C:\Projekat> git commit -m "Ubacena slika na sajt"
[dizajner-slike 7d98b32] Ubacena slika na sajt
 1 file changed, 3 insertions(+)

Сада се грана dizajner-slike разликује у односу на главну грану. Да би проверио ту тврдњу врати се на главну грану па погледај index.html фајл:

PS C:\Projekat> git checkout master
Switched to branch 'master'
PS C:\Projekat> code .

На главној грани у index.html фајлу не виде се никакве промене!

Нека истовремено и копирајтер жели да измени садржај странице – постави наслов и промени други пасус текста. Копирајтеру можеш да креираш грану kopirajter-tekst.

PS C:\Projekat> git branch kopirajter-tekst
PS C:\Projekat> git checkout kopirajter-tekst
Switched to branch 'kopirajter-tekst'

Он ће добити копију главне гране без измена које је направио дизајнер и на тој копији гране врши своје измене у index.html фајлу:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" type="text/css" href="style.css">
    <title>My First Web Page</title>
</head>
<body>
    <h1>Hello, World!</h1>
    <p>A "Hello, World!" program is generally a simple computer program which
        outputs a message "Hello, World!"...</p>
</body>
</html>

Сачувај промене. Провери статус, стејџуј и комитуј промене:

PS C:\Projekat> git status
On branch kopirajter-tekst
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:   index.html

no changes added to commit (use "git add" and/or "git commit -a")
PS C:\Projekat> git add --all
PS C:\Projekat> git status
On branch kopirajter-tekst
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   index.html

PS C:\Projekat> git commit -m "Izmenjen tekst na sajtu"
[kopirajter-tekst bdd4d04] Izmenjen tekst na sajtu
 1 file changed, 3 insertions(+), 2 deletions(-)

Тренутно је следеће стање: из главне гране (master) креиране су две гране dizajner-slike и kopirajter-tekst. На грани dizajner-slike фајл index.html модификовао је дизајнер, а на грани kopirajter-tekst исти фајл модификовао је копирајтер.

Спајање грана

И дизајнер и копирајтер завршили су свој посао и промене које су направили треба да се објаве на сајту. Нека је, на пример, дизајнер завршио први. Потребно је да се пребациш на главну грану и спојиш грану dizajner-slike са главном граном:

PS C:\Projekat> git checkout master
Switched to branch 'master'
PS C:\Projekat> git merge dizajner-slike
Updating 9b6dba6..7d98b32
Fast-forward
 index.html | 3 +++
 1 file changed, 3 insertions(+)

Тренутно је следеће стање: главна грана спојена је са граном dizajner-slike (на обе гране налази се исти садржај). На грани kopirajter-tekst налазе се измене које је направио копирајтер у односу на оригиналан садржај главне гране (без измена које је направио дизајнер).

Конфикти приликом спајања грана

Ако желиш сада да спојиш грану kopirajter-tekst на главну грану јавиће се конфликти приликом спајања. Зашто? На главној грани налазе се измене дизајнера, односно, садржај главне гране је измењен у односу на оригинални садржај из које је креирана грана kopirajter-tekst:

PS C:\Projekat> git merge kopirajter-tekst
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

То потврђује и Git статус:

PS C:\Projekat> git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)
        both modified:   index.html

no changes added to commit (use "git add" and/or "git commit -a")

Конфликт мораш сам да решиш – Git систем не може да чита мисли и одлучи шта треба да се задржи, а шта одбаци. Ако отвориш index.html у едитору његов садржај биће следећи:

Конфликт након спајања у index.html фајлу

па овај конфликт можеш да разрешиш овако:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" type="text/css" href="style.css">
    <title>My First Web Page</title>
</head>
<body>
    <h1>Hello, World!</h1>
    <p>A "Hello, World!" program is generally a simple computer program which
        outputs a message "Hello, World!"...</p>
    <a title="Brian Kernighan, 1978, CC BY-SA 3.0">
        <img width="640" alt="Hello World" src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/21/Hello_World_Brian_Kernighan_1978.jpg/256px-Hello_World_Brian_Kernighan_1978.jpg">
    </a>
</body>
</html>

Сада можеш да стејџујеш и комитујеш промене:

PS C:\Projekat> git add index.html
PS C:\Projekat> git commit -m "Merge nakon razresenja konflikta"
[master 9fe82d7] Merge nakon razresenja konflikta

Пошто ти гране за дизајнера и копирајтера више не требају, можеш да их обришеш:

PS C:\Projekat> git branch -d dizajner-slike
Deleted branch dizajner-slike (was 7d98b32).
PS C:\Projekat> git branch -d kopirajter-tekst
Deleted branch kopirajter-tekst (was bdd4d04).