Git — шта је то, принципи рада и команде

Аутор: IT Sectr Објављено: 2026-05-09 Време читања: 8 мин

Git — је дистрибуирани систем за контролу верзија отвореног кода, који је створио Линус Торвалдс 2005. године за развој језгра Линукса. За разлику од централизованих система попут SVN-а, Git чува комплетну копију репозиторијума на сваком уређају програмера, што омогућава рад без сталне конекције на сервер. Према подацима Git SCM, 2024, Git се користи у више од 90% свих комерцијалних пројеката развоја софтвера.

Главно

  • Git — дистрибуирани VCS са комплетним историјатом измјена на сваком рачунару програмера.
  • Коммити стварају снимке стања датотека са јединственим SHA-1 хешом за праћење измјена.
  • Гране у Git-у изолују развој функција и омогућавају паралелни рад без конфликата.
  • Merge и Rebase — два начина интеграције измјена са различитим приступима историјату коммита.
  • GitHub, GitLab и Bitbucket — веб платформе које додају UI и CI/CD на Git репозиторијуме.

Шта је Git?

Git — је дистрибуирани систем за контролу верзија (VCS) који прати измјене у датотекама и омогућава више програмера да истовремено раде на истом пројекту. За разлику од централизованих система, у Git-у сваки програмер има комплетну копију репозиторијума, укључујући цијели историјат измјена, што систем чини отпорним на губитак података и не захтијева сталну везу са централним сервером.

Историја Git-а почела је 2005. године, када је Линус Торвалдс створио нови VCS након што је компанија BitKeeper повукла бесплатну лиценцу за свој систем за програмере језгра Линукса. Циљеви су били: брзина, једноставност архитектуре, подршка за нелинеарни развој кроз гранање и потпуна дистрибуираност. За 3 мјесеца Торвалдс је написао језгро Git-а, а већ након годину дана пројекат је прешао на самоодржавање под вођством Џунија Хамана.

Према анкети Stack Overflow (2024), 93,9% професионалних програмера користи Git, што га чини доминантним системом за контролу верзија у индустрији. Најближи конкурент — Subversion (SVN) — користи се само у 5,2% пројеката, углавном у великим корпоративним окружењима са централизованим процесима.

Како ради Git: репозиторијум и коммити

Git репозиторијум — директоријум у којем Git прати измјене свих датотека. Унутар директоријума налази се скривени фолдер .git, гдје се чувају сви објекти система: коммити, стабла, блобови и референце. Када програмер креира коммит, Git не копира датотеке у цјелини — он ствара снимак стања (snapshot) и чува референцу на њега.

Сваки коммит садржи: јединствени SHA-1 хеш (40 карактера), референцу на претходни коммит (parent), аутора, датум, поруку коммита и референцу на стабло (tree) које описује стање датотека у тренутку коммита. Ланац коммита формира усмјерени ациклични граф, гдје сваки коммит показује на једног или више родитеља.

bash
# Иницијализација репозиторијума
git init my-project
cd my-project

# Креирање коммита
echo "Hello, Git" > README.md
git add README.md
git commit -m "Initial commit"

# Преглед историјата
git log --oneline --graph --all

Git користи три главне области: working directory (датотеке на диску), staging area (индекс гдје доспјевају припремљене датотеке) и repository (историјат коммита). Команда git add премјешта измјене из радног директоријума у staging, а git commit фиксира садржај staging-а у репозиторијуму. Ово раздвајање омогућава програмеру да састави смислени коммит из скупа измјена, без фиксирања сваке исправке појединачно.

Основне Git команде

Основне Git команде покривају 90% свакодневних операција програмера. Команда git clone ствара локалну копију удаљеног репозиторијума, git pull преузима измјене са сервера и спаја их са тренутном граном, а git push шаље локалне коммите на сервер. Ове три команде чине основни циклус рада са Git-ом.

За преглед стања користи се git status — показује које датотеке су измијењене, које су додате у staging и које се не прате. git diff приказује конкретне измјене у датотекама прије додавања у staging. Испод је табела са најчешће коришћеним командама:

КомандаРадњаПримјер
git cloneКопира удаљени репозиторијумgit clone https://example.com/repo
git addДодаје датотеке у staginggit add src/main.kt
git commitФиксира измјене у историјатуgit commit -m "Fix login bug"
git pushШаље коммите на серверgit push origin main
git pullПреузима измјене са сервераgit pull origin feature

За поништавање измјена Git нуди неколико опција. git reset помјера показивач гране на задати коммит и може ресетовати staging или радни директоријум. git revert ствара нови коммит који поништава измјене наведеног коммита — ово је сигуран начин поништавања за заједничке гране, јер се историјат не преписује.

Гране у Git-у: main, feature и release

Гране у Git-у — лагани помични показивачи на одређени коммит. Стварање нове гране не копира датотеке, већ само ствара нови показивач, што чини гранање практично тренутним. Грана main (раније master) — главна грана пројекта која садржи стабилан, спреман за објављивање код.

Стандардна пракса је коришћење Git Flow или GitHub Flow. У Git Flow-у се користе гране: main (издавачки код), develop (интеграциона грана), feature/* (нове функције), release/* (припрема издања) и hotfix/* (хитне исправке). GitHub Flow је једноставнији: само main и feature гране, а све измјене се достављају кроз Pull Request.

bash
# Креирање и пребацивање гране
git branch feature-auth
git checkout feature-auth
# или једном командом:
git checkout -b feature-auth

# Списак грана
git branch --list
git branch -a  # все ветки, включая удалённые

# Брисање гране
git branch -d feature-auth

Важно својство гранања у Git-у — могућност cherry-pick: преношење појединачног коммита из једне гране у другу командом git cherry-pick <hash>. Ово је корисно када треба пренијети исправку грешке из feature гране у release без спајања цијеле гране. Git такође подржава пребазирање (rebase) и интерактивно пребазирање (git rebase -i) за лијепљење, преуређивање и уређивање коммита.

Спајање: Merge и Rebase

Merge (спајање) ствара посебан merge-коммит који има два родитеља. Овај коммит биљежи чињеницу спајања двије гране и чува комплетан историјат — види се гдје и када је дошло до спајања. Merge чува историјат у облику у којем је створен, што поједностављује ревизију, али чини граф коммита сложенијим.

Rebase (пребазирање) умјесто стварања merge-коммита премјешта коммите тренутне гране на врх циљне гране. Историјат постаје линеаран — ствара се утисак да је развој текао секвенцијално. Међутим, rebase преписује историјат, мијењајући SHA-1 хешеве коммита, што га чини опасним за заједничке гране којима имају приступ други програмери.

Препорука за избор: користите merge за јавне гране гдје историјат виде други програмери (feature → develop), и rebase за локални рад, када требате примијенити свјеже измјене из main-а у своју feature грану прије креирања Pull Request-а. Правило је једноставно: ако је коммит већ послат на сервер — немојте га пребазирати.

Рјешавање конфликата

Конфликт спајања настаје када Git не може аутоматски да споји измјене у једној датотеци. Git означава конфликтне дијелове у датотеци посебним маркерима: <<<<<<< (наше измјене), ======= (раздвајач), >>>>>>> (њихове измјене). Програмер ручно уређује датотеку, бирајући жељену варијанту или комбинујући обје, и завршава спајање коммитом.

Рад са удаљеним репозиторијумима

Удаљени репозиторијум (remote) — копија Git репозиторијума која се налази на серверу. GitHub, GitLab и Bitbucket су најпопуларније платформе за хостинг удаљених репозиторијума. Оне пружају веб интерфејс за преглед кода, управљање приступом, преглед кода и интеграцију са CI/CD системима.

У Git-у се може конфигурисати више удаљених репозиторијума за један пројекат. Подразумијевано, главни remote се зове origin. Команда git remote add додаје нови remote, git fetch преузима измјене без спајања, а git pull је скраћеница за git fetch + git merge. За рад са кодом путем Pull Request-а, програмер креира форк репозиторијума, клонира га, ради у feature грани и шаље захтјев за спајање у оригинални репозиторијум.

bash
# Додавање удаљеног репозиторијума
git remote add origin https://github.com/user/repo.git

# Преглед удаљених репозиторијума
git remote -v

# Слање гране на сервер
git push -u origin feature-auth

# Преузимање измјена са удаљене гране
git pull origin main

Удаљени репозиторијуми подржавају означавање за обиљежавање издавачких верзија. Ознаке могу бити лаке (само показивач на коммит) и анотиране (садрже метаподатке: аутор, датум, порука). Анотиране ознаке се препоручују за издавачке верзије, јер преносе потпуне информације о верзији и могу бити потписане GPG кључем за верификацију ауторства.

Git Worktree за паралелни рад

Git Worktree омогућава истовремени рад са више грана у различитим директоријумима без пребацивања између њих. Команда git worktree add ../feature-auth feature-auth ствара нови радни директоријум feature-auth, гдје се може писати код без мијењања гране у главном директоријуму. Worktree је користан за брзе исправке у release грани када је главни директоријум заузет дуготрајним развојем.

Git Submodules за зависности

Git Submodules — механизам укључивања једног Git репозиторијума у други. Подмодул чува референцу на фиксни коммит спољашњег репозиторијума, што гарантује поновљивост компајлирања. Команда git submodule add https://github.com/example/lib.git додаје спољашњу библиотеку као подмодул. При клонирању пројекта са подмодулима потребно је извршити git submodule update --init --recursive за учитавање свих зависности.

Често постављана питања

По чему се Git разликује од SVN-а?

Git — дистрибуирани VCS са локалним историјатом и могућношћу рада офлајн. SVN — централизовани систем који захтијева сталну везу са сервером за све операције осим прегледа датотека.

Како поништити последњи коммит?

Користите git revert HEAD за безбједно поништавање (ствара се нови коммит). Ако коммит још није послат на сервер, можете користити git reset --soft HEAD~1.

Шта је .gitignore и чему служи?

.gitignore — датотека у којој су наведени обрасци датотека и директоријума које Git треба да игнорише. Користи се за искључивање привремених датотека, компајлирања и IDE конфигурација из репозиторијума.

Која је разлика између git pull и git fetch?

git fetch преузима измјене са сервера, али их не спаја са тренутном граном. git pull ради fetch и одмах извршава merge. За контролу користите fetch + преглед diff, затим ручни merge.

Како исправити поруку последњег коммита?

Користите git commit --amend — ова команда отвара уређивач за измјену поруке коммита. Ако је коммит већ на серверу, биће потребно git push --force, што је опасно за заједничке гране.

Закључак

  • Git — дистрибуирани систем за контролу верзија од Линуса Торвалдса, који је постао стандард у развоју софтвера.
  • Коммити биљеже снимке стања датотека са SHA-1 хешом и референцом на претходни коммит.
  • Гране — лагани показивачи на коммите, који омогућавају паралелни развој функција.
  • Merge ствара merge-коммит са два родитеља, Rebase — преписује историјат за линеарни граф.
  • Удаљени репозиторијуми (origin) синхронизују код између програмера путем push и pull.
  • GitHub, GitLab, Bitbucket додају веб интерфејс, преглед кода и CI/CD на Git.
  • Почните клонирањем репозиторијума и савладавањем три команде: commit, push, pull — one покривају основни циклус рада.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође