У систему 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
у едитору његов садржај биће следећи:
па овај конфликт можеш да разрешиш овако:
<!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).