# Week-1: Git - Sistem za verzionisanje koda

**Git** je alat koji je razvio [Linus Torvalds](https://en.wikipedia.org/wiki/Linus_Torvalds) kako bi olaksao vodjenje jednog velikog i kompleksnog projekta – **Linux kernela**. Git je de-facto postao standardni alat za verzionisanje koda.

### Git - Osnovni pojmovi

* **Init** – Inicijalizacija Git repozitorijuma. Inicijalizacija se obavlja komandom `git init` u direktorijumu u kojem se nalazi projekat.
* **Repozitoriji** – Git repozitorijum je mesto gde se nalaze sve verzije projekta.
  * **Remote** – Remote je udaljeni/remote repozitorijum (npr. onaj koji ste kreirali na git serveru, GitHub-u etc.).
  * **Local** – Local je lokalni repozitorijum (incijaliziran na vasem lokalnom racunaru).
* **Add** – Add je proces dodavanja fajlova u staging area. Fajlovi se dodaju komandom `git add` ili `git add .` (dodaje sve fajlove u trenutnom direktorijumu).
* **Staging Area** – Staging area je mesto gde se nalaze fajlovi koji ce biti dodati u commit.
* **Commit** – Commit je verzija projekta. Commit se sastoji od snapshot-a projekta i metapodataka koji opisuju commit.
* **Push** – Push je proces slanja izmjena koda iz lokalnog repozitorijuma na udaljeni/remote repozitorijum (npr. na GitHub).
* **Branch** – Branch je nezavisna linija/grana razvoja projekta. Branch se koristi da bi se razvijale nove funkcionalnosti neovisno od glavne `main` grane, Branch/Grana se moze spojiti sa drugom granom/branch-om.
* **Pull** – Pull je proces preuzimanja izmjena koda iz udaljenog/remote repozitorijuma na lokalni repozitoriji (onaj na vasem racunaru).
* **Merge** – Merge je proces spajanja dve grane/branch-a u jednu granu/branch.
* **Pull Request** – Pull request je zahtjev za spajanje izmjena iz jedne grane/branch-a u drugu granu/branch.
* **Fork** – Fork je kopija projekta. Fork se koristi da bi se napravila kopija postojeceg projekta i nastavio rad na njemu bez uticaja na originalni projekat. Fork se moze spojiti sa originalnim projektom koristeci Pull Request.

<figure><img src="https://3615466217-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F59R9sUwe6TQDoNHQXvvv%2Fuploads%2FmaXU5fOUcAHHtKRUZuia%2Fimage.png?alt=media&#x26;token=03887767-61fa-48f1-9e65-e4df67eeb58b" alt=""><figcaption></figcaption></figure>

### **Osnovne Git Naredbe**

```bash
$ git init #inicijalizacija git repozitorijuma

$ git status #prikaz statusa repozitorijuma

$ git add file-name #dodavanje fajla u staging area

$ git add . #dodavanje svih fajlova iz radnog direktorija ova u staging area

$ git commit -m"commit message" #kreiranje commit-a

$ git push #slanje izmjena na udaljeni/remote repozitorijum

$ git pull #preuzimanje izmjena sa udaljenog/remote repozitorijuma

$ git log #prikaz loga commit-ova

$ git log --oneline #prikaz loga commit-ova u jednoj liniji

$ git log --oneline --graph #prikaz loga commit-ova u jednoj liniji sa 
                            #grafickim prikazom

$ git clone repo-url #kloniranje projekta sa udaljenog/remote repozitorijuma

$ git remote -v #prikaz povezanih udaljenih/remote repozitorijuma

$ git branch #prikaz trenutne grane/branch-a unutar kojeg se nalazite

$ git branch branch-name #kreiranje nove grane/branch-a od trenutne 
                         #grane/branch-a na kojem se nalazite, 
                         #necete biti automatski prebaceni na novu granu/branch

$ git merge branch-name #spajanje grane/branch-a sa trenutnom granom/branch-om

$ git checkout branch-name #prebacivanje na drugu granu/branch

$ git remote add origin repo-url #povezivanje lokalnog repozitorijuma sa 
                                 #udaljenim/remote repozitorijumom

$ git config --global user.name "username" #podesavanje korisnickog imena --global 
                                           #znaci da ce ove postavke biti 
                                           #primjenjene na svaki repozitorijum na 
                                           #vasem racunaru
```

### Git Cheat Sheet

<figure><img src="https://3615466217-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F59R9sUwe6TQDoNHQXvvv%2Fuploads%2F47lakPJbLL34FRR2sjKh%2Fimage.png?alt=media&#x26;token=ab2acf5f-d6ef-4e79-b7ed-770f62d64c25" alt=""><figcaption><p>Git Cheat Sheet by Jan Kruger</p></figcaption></figure>

### Snimci predavanja

#### DevOps Mentorship Program - Week 1 - Git & GitHub ([#tier](https://www.youtube.com/hashtag/tier)-1-group-1)

{% embed url="<https://youtu.be/jNPFe9vdRFI>" %}
DevOps Mentorship Program - Week 1 - Git & GitHub ([#tier](https://www.youtube.com/hashtag/tier)-1-group-1)
{% endembed %}

#### DevOps Mentorship Program - Week 1 - Git & GitHub (#tier-1-group-2)

{% embed url="<https://youtu.be/FDOho51mkuE>" %}
DevOps Mentorship Program - Week 1 - Git & GitHub (#tier-1-group-2)
{% endembed %}

### Materijali za ucenje

* [Uvod u Git - Tomo Krajina](https://github.com/allops-solutions/devops-aws-mentorship-program/blob/main/resources/books/github_knjiga_tomo_krajina.pdf)
* [Git Notes for Professionals](https://github.com/allops-solutions/devops-aws-mentorship-program/blob/main/resources/books/git-notes-for-professionals.pdf)
* [Git for Professionals Tutorial - Tools & Concepts for Mastering Version Control with Git](https://www.youtube.com/watch?v=Uszj_k0DGsg)
* [git Documentation](https://git-scm.com/docs/git)

### Korisni alati

* [VS Code Git History Extension](https://marketplace.visualstudio.com/items?itemName=donjayamanne.githistory)
* [VS Code Git Graph Extension](https://marketplace.visualstudio.com/items?itemName=mhutchie.git-graph)
* [VS Code GitLens — Git supercharged Extension](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens)

### Zadatak

Kreirajte javni GitHub repozitoriji unutar svog GitHub racuna i nazovite ga: `ime-prezime-devops-mentorship`. Kreirajte `.gitignore` i `README.md` fajlove. Nakon sto ste kreirali fajlove na vasem lokalnom racunaru postavite ih na GitHub repozitoriji koji ste ranije kreirali. Vas repozitoriji bi trebao da ima dvije grane main i development gdje cete sve izmjene na `main` granu dodavati praveci Pull Request sa `development` grane odnosno branch-a.&#x20;

### Dodatni materijali

#### Knjige

* [Git Pro - Scott Chacon & Ben Straub](https://git-scm.com/book/en/v2)

#### Video materijali

* [The gitflow workflow - in less than 5 mins.](https://www.youtube.com/watch?v=1SXpE08hvGs\&ab_channel=Devchild)
* [Professional Guides: Workflow Strategies](https://www.youtube.com/watch?v=aJnFGMclhU8\&ab_channel=GitHubTraining%26Guides)
* [Git Flow vs GitHub Flow: What You Need to Know](https://www.youtube.com/watch?v=hG_P6IRAjNQ\&ab_channel=AlexHyett)
* [Git Tutorial - Git Crash Course using BitBucket](https://www.youtube.com/watch?v=1tC6Z57AOkY\&t=984s\&ab_channel=AHTCloud)

#### Blog Postovi

* [15 Git Commands You May Not Know](https://dev.to/zaiste/15-git-commands-you-may-not-know-4a8j)
* [Introduction to git flow](https://blog.knoldus.com/introduction-to-git-flow/)
* [Mastering git merge and rebase](https://towardsdatascience.com/mastering-git-merge-and-rebase-f2a7c5c348a9)
* [Git Flow vs Github Flow\*\*](https://www.geeksforgeeks.org/git-flow-vs-github-flow/)
