Documente Academic
Documente Profesional
Documente Cultură
Sistem Control
Versiuni
v3.0
1
Agenda
1. Introducere 8. Conflict!
2. Lansarea terminalului 9. Branches (Ramuri)
3. Instalarea lui GIT 10. Fișierul .gitignore
4. Cum funcționează sistemul de control al 11. Depanarea problemelor cu Git
versiunilor? 12. Informații de copyright strict necesare
5. Git – sintaxa de bază 13. Linkuri utile pentru utilizatorii de GIT
6. Repositories (Depozitare)
7. Lucrul în echipă
2
Introducere
3
Controlul Versiunilor – ce înseamnă?
4
Cum folosim un VCS?
Folosirea unui VCS este foarte importantă când lucrezi la un proiect.
Aduce numeroase avantaje:
5
Ce este Git?
6
Lansarea
terminalului
7
Cum să deschizi terminalul?
Dacă ești un utilizator de Ubuntu
Deschide-ți terminalul cu următoarea combinație user@comp:~S
de taste:
Ctrl+Alt+T
8
Cum să deschizi terminalul?
Dacă ești utilizator de windows:
1. Instalează Git Bash (vei găsi un manual în Agata@Agata-Coderslab MINGW64 ~$
capitolul următor).
2. Deschide Git Bash.
9
Cum să deschizi terminalul?
Dacă ești utilizator de MacOS
1. Deschide terminalul folosind combinația de MacBook-Pro: ~SomeUser
taste: Cmd+space.
2. În fereastra Spotlight tastează terminal.
3. Confirmă cu Enter.
10
Instalarea Git
11
Instalarea Git
Dacă ești user de Ubuntu
1. Deschide terminalul.
2. Introdu următoarele comenzi în terminal:
sudo apt-get update
sudo apt-get install git
12
Installer Git
Dacă ești un utilizator Windows
1. Introdu https://git-scm.com/download/win
(programul se va descărca automat).
2. Pe durata instalării alege opțiunile implicite.
3. rulează programul descărcat.
13
Instalarea Git
Dacă ești un utilizator MaxOS
1. Du-te la https://git-scm.com/download/mac
(programul se va descărca automat).
2. Pe durata instalării alege opțiunile implicite.
3. rulează programul descărcat.
14
Configurarea Git
Setări de bază
Git are nevoie de datele personale, ca să poată adăuga schimbările codului. Adaugă-ți numele,
prenumele și e-mailul în configurație,
Lansează terminalul și introdu comenzile următoare:
git config --global user.name "name and last name"
git config --global user.email "email address"
15
Configurare Git
Editorul de Text
Ai putea dori să comentezi schimbările interactiv,
folosind un editor de text. Un editor de text pentru
Git este Vim*. Dacă vrei să schimbi editorul**,
citește slide-urile următoare.
* Vim este unul dintre cele mai clasice, editoarele de text pentru sistemele UNIX și
altele asemenea. E foarte folositor. deși e dificile de folosit mai ales pentru
începători. (https://en.wikipedia.org/wiki/Vim)
** Ai încredere și fă-o.
16
Configurarea Git
17
Configurarea Git
18
Configurarea Git
19
Cum
funcționează
controlul
versiunilor?
20
Cum funcționează controlul versiunilor?
21
Cum funcționează controlul versiunilor?
Luni, 9:00 am
Agata creează fișiere noi:
index.html
about-us.html
Le salvează întru-n sistem de control al versiunilor
și descrie schimbările făcute
22
Cum funcționează controlul versiunilor?
Miercuri, 2:00 pm
Agata modifică acest fișier:
index.html
23
Cum funcționează controlul versiunilor?
Vineri, 7.55 pm (5 minute și e weekend)
Marin modifică fișierul:
termsandconditions.html
Elimină mare parte a conținutului din
termsandconditions.html și schimbă apsectul
fișierului.
Îl salvează în sistemul de control al versiunii și
descrie schimbările făcute.
24
Cum funcționează controlul versiunilor?
BRUSC!
Se dovedește că Marin n-ar fi trebuit să modifice
termsandconditions.html!
Înseamnă că toat munca făcută s-a pierdut?
Din fericire - nu! Marin se poate întoarce la
versiunea de dinaintea schimbării - versiunea
numărul 2, din data de Miercuri, 2:00 pm.
Weekend-ul a fost salvat! Ce bine!
25
Git – sintaxa
primară
26
Bazele lui Git
27
Git
28
GIT CheatSheet (Foaia cu Trucuri)
29
Depozitare
(Repositories)
30
Depozitar (Repository)
31
Depozitarul local
32
Lucrul local
Proiectul nou al lui Marin – o pagină de
introducere (Landing Page)
Marin creează un depozitar local (pentru moment
este gol). Pentru a crea depozitarul, trebuie să
introducă :
git init
33
Lucrul local
Marin controlează versiunile fișierelor
Marin creează un nou fișier: landing-page.html
Acum, Marin trebuie să informeze Git, despre
intenția sa de a adăuga fișierele.
git add landing-page.html
34
Lucrul local
Marin stochează schimbările în sistemul de
control al versiunilor
Acum plasează modificările in Git: landing-
page.html
35
Depozitarul extern (remote)
Folosești un depozitar extern când vrei să împarți codul cu alte persoane (de exemplu, colegii) sau vrei
să te alături unui proiect deja existent.
36
Depozitar Local vs Extern
Dacă vrei să te alături unui proiect existent, copiază depozitarul extern pe hard drive-ul tău. Această
acține se numește clonare.
Un depozitar local cu versiunea curentă va fi creat.
După efectuarea schimbărilor, salvezi(commit) schimbările într-ul depozitar local, și apoipush (le
împingi) pe un server extern. Din acel moment, ceilalți vor putea fi văzute și de alții.
37
Lucrul cu depozitare
Proiect nou – un magazin online
38
Lucrul cu depozitare
Proiect nou – un magazin online
2. Apoi, Agata clonează depozitarul extern pe
laptopul ei. Acum are un depozitar local.
39
Lucrul cu depozitare
Proiect nou – un magazin online
3. Agata lucrează la noile fișiere.
product.html
basket.html
Agata le adaugă în sistemul de control al
versiunilor:
git add *.html
40
Lucrul cu depozitare
Update-ul unui depozitar extern
4. Agata împinge modificările în depozitarul
remote.
product.html
basket.html
git push
41
Lucrul în echipă
42
Lucrul în echipă
43
Lucrul în echipă
Marin se alătură proiectului
3. Marin are nevoie să place de la calculator. Când se întoarce, vrea să verifice modificările făcute până
în prezent:
44
Lucrul în echipă
45
Lucrul în echipă
Marin se alătură proiectului
4. Marin adaugă modificările în Git:
product.html
order.html
git add .
git commit -m "product and order"
46
Lucrul în echipă
Marin se alătură proiectului
4. Marin adaugă modificările în Git:
product.html
order.html
git add .
git commit -m "product and order"
47
Lucru în echipă
Marin Se alătură proiectului
5. Marin împinge modificările către depozitarul
extern.
git push
48
Lucrul în echipă
Ce se întâmplă dacă Agata se întoarce să
lucreze la depozitarul ei extern?
6. Agata a făcut versiunea 1, Martin a adăugat
versiunea 2 în depozitarul extern.
Agata editează un fișier:
product.html
Agata adaugă fișierul în sistemul de control al
versiunilor și declară (commit) modificările:
git add product.html
git commit -m "working on a product"
49
Lucrul în echipă
BRUSC!
7. Agata încearcă să împingă fișierul (git push), dar primește un mesaj ca cel de jos. Git o informează
pe Agata, că sun schimbări declarate de Marin în depozitarul extern. Modificările lui marin, previn
declarările (commits) modificărilor Agatei
Can we solve Problema Agatei?
! [rejected] master -> master (fetch first)
error: failed to push some refs to
"https://github.com/martin-barylka/online-shop.git"
HINT: Updates were rejected because the remote contains work that you do
HINT: not have locally. This is usually caused by another repository pushing
HINT: to the same ref. You may want to first integrate the remote changes
HINT: (e.g., "git pull ...") before pushing again.
HINT: See the "Note about fast-forwards" in "git push --help" for details.
50
Lucrul în echipă
51
Lucrul în echipă
Nimic rău nu s-a întâmplat
8. Agata trebuie să combine modificările ei cu ale lui Marin. Ar trebui deci să utilizeze comanda pull
git pull
52
Lucrul în echipă
53
Conflict!
54
Conflict!
Agata lucreză la fișierul order.html. Ea pune fișierul în depozitarul extern. Câteva zile mai târziu, Marrin
lucrează la același fișier. El încearcă să-l pună tot pe depozitarul extern. El primește un mesaj (deja
cunoști acest mesaj) despre celelalte modificări aflate în așteptare în depozitarul extern. Marin încearcă
să descarce modificările cu comanda git pull
! [rejected]master -> master (fetch first)
error: failed to push some refs to
"https://github.com/martin-barylka/online-shop.git"
HINT: Updates were rejected because the remote contains work that you do
HINT: not have locally. This is usually caused by another repository pushing
HINT: to the same ref. You may want to first integrate the remote changes
HINT: (e.g., "git pull ...") before pushing again.
HINT: See the "Note about fast-forwards" to "git push --help" for details.
agatalagata:~/workspace/online-shop$
55
Conflict!
56
Conflict!
BRUSC!
marin@comp:~/workspace/online-shop$ git pull
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/martin-barylka/online-shop
c9d6e9d..38d8078 master -> origin/master
Auto-merging order.html
CONFLICT (content): Merge conflict in order.html
Automatic merge failed; fix conflicts and then commit the result.
marcin@xwing:~/workspace/online-shop$
57
Conflict!
58
Conflict!
Un conflict în cod nu e lucru atât de grav.
Git nu a reușit să combine automat modificările lui Marin cu ale Agatei
Marin trebuie să combine modificările manual, și apos să efectueze commit și push cu rezultatul
combinării.
Contrar a ceea ce te-ai putea aștepta, acest lucru e destul de ușor pentru programatori. Încă pot lucra pe
același fișier simultan.
Git se va asigura că nu vor suprascrie modificările unuia peste ale celuilalt. Dacă Git nu poate efectua
integrarea, va cere ajutorul programatorilor.
<<<<<<< HEAD
======
>>>>>>> 38d80788ccebc005ed48aa225cb5668d8704474b
<h1>Order</h1>
59
Conflict!
<<<<<<< HEAD
======
>>>>>>> 38d80788ccebc005ed48aa225cb5668d8704474b
<h1>Order</h1>
60
Conflict!
<<<<<<< HEAD
======
>>>>>>> 38d80788ccebc005ed48aa225cb5668d8704474b
<h1>Order</h1>
61
Conflict!
<<<<<<< HEAD
======
>>>>>>> 38d80788ccebc005ed48aa225cb5668d8704474b
<h1>Order</h1>
62
Conflict!
<<<<<<< HEAD
======
>>>>>>> 38d80788ccebc005ed48aa225cb5668d8704474b
<h1>Order</h1>
63
Conflict!
Marin rezolvă conflictul. Fișierul corectat:
El are nevoie să: <h1>Order</h1>
1. Să elimine liniile adăugate automat de Git
(liniile 1, 5 și 7).
2. Să combine codul astfel încât să salveze
modificările Agatei. Acest pas cere înțelegerea
schimbărilor și combinarea lor manuală
64
Conflict!
Marin rezolvă conflictul
3. Adaugă modificările în sistemul de control al versiunilor (git add).
4. Execută un git commit cu un comentariu aferent soluționării conflictului.
5. Împinge schimbările către depositarul remote git push.
65
Unelte de
soluționare a
conflictelor
66
Unelte de combinare a codului
67
meld
Instalare
Dacă folosești script-ul nostru de instalare, meld Iată cum îl configurezi:
este deja instalat și configurat pe mașină. Dacă git config --global merge.tool meld
nu, atunci în Ubuntu o poți face folosind
comanda: Linia de mai sus spune că meld este din acest
moment înainte unealta principală de soluționare a
sudo apt install meld combinării (merge) fișierelor din Git.
Pe MacOS e făcută astfel:
brew cask install meld
68
Unealta de integrare a modificărilor
Rezolvarea conflictelor
Acum poți rezolva conflictele într-un mod mai simplu. Tot ce trebuie să faci e să introduci următoarea
comandă în terminal:
git mergetool
69
meld
70
meld
Panoul din stânga arată modificările locale, adică ramura (branch) pe care te afli.
Panoul din dreapta arată depozitarul extern sau, mai precis ramura cu care vrei să combini
(merge) ramura ta .
Panoul din mijloc arată codul rezultat.
71
meld
Efectuând click pe săgețile corespunzătoaer putem integra modificările în fișeirul rezultat. De exemplu,
făcând un click pe săgeata de stânga (din panoul drept), vei muta elementul <meta> în panoul din mijloc:
72
Integrarea modificărilor
După salvarea modificărilor (CTRL+S) și soluționarea tuturor conflictelor va trebui să efectuezi commit
pentru integrarea schimbărilor:
git add .
git commit -m "conflict rezolvat"
73
Ramuri
(Branches)
74
Ramura (Branch)
75
Ramura (Branch)
Marin creează o altă ramură (branch)
O ramură (branch) este o copie a codului din depozitarul curent care poate fi dezvoltată independent de
versiunea principală. Este folosită pentru experimentare, sau (de obicei) pentru a adăuga funcționalități
noi, în așa fel încât, acestea să nu strice versiunile funcționale anterioare.
Crearea unei ramuri:
Pentru a crea o nouă ramură, introdu următoarea comandă în terminal:
git checkout -b <nume-ramură>
Deci, dacă Marin vrea să creeze o nouă ramură numită experiment, trebuie să introducă următoarea
comandă:
git checkout -b experiment
76
Ramura (Branch)
Alternarea ramurilor
Când marin introduce următoarea comandă în terminal:
git branch
master este principala ramură de cod. Aceasta este creată atuomat la inițierea depozitarului. Ramura
numită experiment este cea pe care Marin tocmai a inițiat-o. Un asterisc se află alături de ea. Acesta
marchează ramura pe care Marin se află în prezent.
77
Ramura (branch)
Poți alterna ramurile oricând. Tot ce trebuie să faci este să introduci comanda:
git checkout <nume-ramură>
Dar, înainte ca Marin să poată schimba ramura, el trebuie să declare (commit) modificările:
git add order.html
git commit -m "experimental changes"
git checkout master
78
Ramură (Branch)
Combinarea ramurilor
Marin și-a termiat lucrul la ramura experimentală a
codului și a primit aprobarea de a o combina cu
principala ramură a codului. Astfel el are nevoie să
efectueze un (merge) al schimbărilor sale în
ramura principală.
În primul rând, e necesar ca el să treacă pe
ramura principală:
git checkout master
80
.gitignore
Unele fișiere în proiectul nostru au rost numai pentru noi și nu vrem să le plasăm în depozitar. De
exemplu, acesta include:
configurarea fișierelor editorului tău de cod (alți programatori ar putea folosi alte unelte de editare și
n-au nevoie de ele )
fișiere cu parole ale bazelor de date (din motive de securitate),
fișiere binare complexe (cum ar fi fișierele .class, .pyc files etc.),
...și multe altele.
Cum să previi trimiterea în depozitar al acestor fișiere?
81
.gitignore
Exact :) Greșit! :(
Ar trebui să creezi un fișier .gitignore, unde De fiecare dată când adaugi fișiere în contolul
creăm o listă de fișiere și directoare, care nu vor fi versiunior, introduci numele lor aici. Ține minte să
adăugate în depozitar. nu adaugi aici fișiere în plus:
Atenție: reține că aceste fișiere care încep cu . $ git add client.html folder.html
sunt fișiere ascunse în li Linux și Mac!
...pentru că poți greși adăugând prea multe.
Reține: chiar dacă elimini aceste fișiere la un
moment dat, vechile versiuni rămân în depozitar
pentru totdeauna!
82
.gitignore
Construcția fișierului .gitignore
În fișierul .gitignore, pe linii consecutive introduci numele directoarelor și fișierelor, astfel:
notes.txt
pycache/
83
.gitignore
Construcția fișierului .gitignore
În fișierul .gitignore, pe linii consecutive introduci numele directoarelor și fișierelor, astfel:
notes.txt
pycache/
84
.gitignore
Construcția fișierului .gitignore
În fișierul .gitignore, pe linii consecutive introduci numele directoarelor și fișierelor, astfel:
notes.txt
pycache/
85
.gitignore
Construcția fișierului .gitignore – continuată
De asemenea poți folosi asterisc (*): un singur asterisc ține loc de orice șir de caractere din numele unui
fișier, de exemplu
*.class
86
.gitignore
Construcția fișierului .gitignore – continuată
logs/**/debug.log
87
.gitignore
88
Depanarea Git
89
Github nu îți îngăduie să faci un push
Dacă nu poți să împingi modificările cu o comandă (git push), you have probably cloned your original
repository instead your fork. The message which appears in the terminal in this case is as follows:
Dacă nu poți să împingi modificările cu o comandă (git push), este posibil să fi clonat depozitarul
original, în locul unei ramificații (fork). Acest mesaj pare în terminal în acest caz, cam așa:
marin@dcomp:~/workspace/spinning-cube$ git push origin master
ERROR: Permission to marin2704/spinning-cube.git denied to marin-cmp.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
90
Github nu îți îngăduie să faci un push
Cum să înlături această eroare?
Intră în contul tău de Github și găsește bifurcația problematică a depozitarului.
Alege opțiunea Clone or download și copiază depozitarul.
Adresa ar trebui să arate așa: https://github.com/<your_login>/<reposotory_name.git>.
91
Informații
obligatorii de
copyright
92
Copyrights
93
Linkuri utile
pentru utilizatorii
de Git
94
Linkuri utile
Pagina Git Project
https://git-scm.com
Manualul oficial Git (gratuit,
în diverse forme)
https://git-scm.com/book/en/v2
Un tutorial interesant de Git
https://try.github.io/levels/1/challenges/1
Alt tutorial de Git
https://www.git-
tower.com/learn/git/ebook/en/mac/introduction
95
Git – Temă
96