Sunteți pe pagina 1din 22

Sistemul de control

al versiunilor - Git

Elaborat: Constantin Cuciurcă


Cuprins:

1. Ce este controlul versiunilor?


2. Instalare Git
3. Utilizare în industrie
4. Git workflow
5. Creare repozitoriu local
6. Clonare repozitoriu
7. Git repos storages
8. Comenzi git
9. Conflicte
10. Gitflow
Ce este controlul versiunilor?
Controlul versiunilor

Controlul versiunilor este un sistem care se ocupă de


gestionarea mai multor versiuni ale unor fișiere. Git
este un exemplu de sistem de control al versiunilor.

Facilități oferite:
- Un sistem ce deține istoricul tuturor modificărilor făcute
- Oferă posibilitatea dezvoltării software colaborative
- Permite să afli cine, când și ce modificări a făcut
- Permite să anulezi modificările și să te întorci la o stare anterioară
- < rm -rf / :D
Git
Cazuri de utilizare:

- Dezvoltare individuală
- Dezvoltare colaborativă
- Utilizare offline

De ce Git?

- Totul are loc local (tot istoricul este disponibil)


- Este rapid
- Stochează snapshot-uri nu doar diferențele
- E distribuit și nu centralizat
- Este considerat cel mai bun
Instalare Git
https://git-scm.com/downloads
După instalare în consolă v-a fi disponibilă comanda git,
pentru a verifica versiunea – executăm comanda:

~/> git --version


git version 2.18.0
Pentru a vă identifica, git are nevoie de identitatea
utilizatorului, pentru a seta identitatea executăm:
~/> git config --global user.name ‘Constantin Cuciurcă’
~/> git config --global user.email ‘punisher@codegod.ml’
Unele companii care utilizează Git
Git workflow

- Stare fișiere: tracked, untracked, ignored.


- Stare fișiere tracked: unmodified, modified, staged sau commited.
- Ignorarea fișiererol are loc prin scrierea numelor
/(folder|fișier)(-ului|-elor)/ în fișierul .gitignore aflat în mapa
rădăcină a proiectului, exemple pot fi găsite:
https://github.com/github/gitignore
gitignore manager: https://github.com/joeblau/gitignore.io
Crearea unui repozitoriu local
~/> mkdir git-ceef # Creare directoriu
~/> cd git-ceef # Schimbare directoriu curent
~/git-ceef> git init # Inițializare repozitoriu git
Initialized empty Git repository in /home/punisher/git-ceef/.git/
~/git-ceef> git remote add origin <remote-repo-url>

Clonarea unui repozitoriu


~/> git clone git@gitlab.com:<group-name>/<project-name>.git
sau
~/> git clone https://gitlab.com/<group-name>/<project-name>.git
~/> cd <project-name>
Git repos storages
- gitlab.com
- github.com
- bitbucket.org

Vom utiliza GitLab, pentru că la moment este leader în provizionarea


soluțiilor de integrări la fel și CI/CD integrat, GitLab CE, și multe
altele.
Generare cheie ssh
~/> ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/punisher/.ssh/id_rsa): /home/punisher/.ssh/test
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/punisher/.ssh/test.
Your public key has been saved in /home/punisher/.ssh/test.pub.
The key fingerprint is:
SHA256:NTUrTdlTg1aTw78SQK+nX3Db5MTZ6dyTXcXONuOdVu4 punisher@rootus
The key's randomart image is:
+---[RSA 2048]----+
| ..+o+=o|
| =o=o=o|
| + =. .=|
| . o.. +*|
| S . o.*%|
| o.*B&|
| . .@B|
| . o..|
| . E|
+----[SHA256]-----+
Adăugare cheie ssh pe GitLab
Comenzi git esențiale
Notă: este necesar ca directorul în care se execută comenzile git să fie un repozitoriu inițializat

~/git-ceef> git status # starea curentă a fișierelor


~/git-ceef> git diff # modificările în fișierele unstaged
~/git-ceef> git diff --cached # modificările în fișierele staged
~/git-ceef> git add <nume-fisier-sau-directoriu> # marchează ca staged
~/git-ceef> git commit -m ‘Message’ # efectuează commit adăugând mesajul dat
~/git-ceef> git commit --amend -m ‘Message’ # Modifică mesajul ultimului commit
~/git-ceef> git push origin master # Trimite modificările spre remote în ramura
master
~/git-ceef> git push -u origin master # Exact precedentul cu unica diferență că
setează ramura master din remote ca predefinită pentru repozitoriul curent
local
~/git-ceef> git pull origin master # Verifică dacă sunt modificări în remote și
le descarcă dacă sunt
Comenzi git reset
Notă: este necesar ca directorul în care se execută comenzile git să fie un repozitoriu inițializat

~/git-ceef> git reset # contrariul git add


~/git-ceef> git reset <commit-hash> # resetează indexul la commit dat după hash
~/git-ceef> git reset --soft HEAD~1 # mută indexul cu un commit anterior fără a
pierde modificările
~/git-ceef> git reset --hard HEAD~1 # mută indexul cu un commit anterior fără a
păstra modificările
~/git-ceef> git reset origin/master # anulează commiturile locale
~/git-ceef> git fetch origin; git reset --hard origin/master # resetează
versiunea locală a ramurei master cu cea remote
Comenzi git analyse
Notă: este necesar ca directorul în care se execută comenzile git să fie un repozitoriu inițializat

~/git-ceef> git log # lista ultimelor commit-uri


~/git-ceef> git log --oneline # o linie per commit doar cu mesajul lui fără
detalii
~/git-ceef> git log --stat # afișează modificările în fișiere la fiecare commit
~/git-ceef> git show <commit-hash> # afișează modificările efectuate în fișiere
într-un commit dat după hash
~/git-ceef> git diff <first-commit-hash> <second-commit-hash> # compară 2
commit-uri
Comenzi git branch
Notă: este necesar ca directorul în care se execută comenzile git să fie un repozitoriu inițializat

~/git-ceef> git branch # lista locală de ramuri (branches)


~/git-ceef> git branch -a # lista completă de ramuri locale, remote
~/git-ceef> git branch some # creare ramură some
~/git-ceef> git checkout some # schimbare ramură curentă la some
~/git-ceef> git checkout -b some # schimbare ramură curentă la some cu creare
dacă nu există
~/git-ceef> git branch -d some # ștergere branch some
Comenzi git merge și rebase
Notă: este necesar ca directorul în care se execută comenzile git să fie un repozitoriu inițializat

~/git-ceef> git checkout feature # schimbare în ramura feature


~/git-ceef> git merge master # unirea ramurii curente cu master
~/git-ceef> git checkout feature # schimbare în ramura feature
~/git-ceef> git rebase master # rebase a ramurii curente cu master
Comenzi git stash
Notă: este necesar ca directorul în care se execută comenzile git să fie un repozitoriu inițializat

~/git-ceef> git stash # salvează temporar


~/git-ceef> git stash pop # aplică fișierele temporare
~/git-ceef> git stash apply # aplică fișierele și păstrează stash
~/git-ceef> git stash -u # salvează inclusiv fișierele care nu sunt tracked
~/git-ceef> git stash save ‘Mesaj’ # salvează cu mesaj
~/git-ceef> git stash list # afișează lista de stash
~/git-ceef> git stash pop stash@{2} # aplică după index
~/git-ceef> git stash clear # șterge toate stash-urile
Conflicte
Notă: Cel mai des conflictele apar atunci când au fost efectuate modificări în aceleași fișiere în
aceleași părți de cod, astfel git nu poate detecta automat schimbările și are semnarează necesitatea
implicării dezvoltatorului

Astfel arată un conflict în git:

Salut, acest proiect a fost creat de


<<<<<<<HEAD
Constantin
=======
The punisher
>>>>>>>feature
Gitflow
Notă: Acest termen ține de modul de management a schimbărilor în git
https://www.atlassian.com/git/tutorials/comparing-workflows

Reguli generale:

- Branch-ul develop este creat din master


- Branch-ul release este creat de pe develop
- Branch-uri per ticker/feature sunt create din develop
- feature branch va fi unit (merged) în develop
- release branch va fi unit în master
- Bug în producție, branch hotfix din master
- hotfix este unit atât în master cât și în develop
That’s not the end...

S-ar putea să vă placă și