Odată creat repository-ul, putem să începem să lucrăm la proiect.
Lucrul la proiect înseamnă să adăugăm și să ștergem fișiere sau să modificăm fișiere existente. De obicei este vorba de fișiere text (human-readable), cel mai des fișiere cod sursă1). Vrem să salvăm aceste adăugări și modificări; apoi să salvăm din nou alte modificări; și tot așa.
Salvarea acestor modificări înseamnă crearea unui commit în repository.
Același lucru îl fac și ceilalți colegi care lucrează la același proiect. Fiecare commit împachetează un set de adăugări și modificări realizate de un dezvoltator al proiectului. Având commiturile în repository putem să gestionăm mai ușor proiectul, adică:
Git se ocupă de păstrarea și gestiunea istoricului repository-ului nostru prin păstrarea listei de commituri făcute. Adică Git păstrează un istoric de versiuni al proiectului.
Când facem un commit, acesta va fi reținut în repository-ul Git local, nu și în repository-ul Git remote.
Fără a actualiza și repository-ul remote, ceilalți colegi nu vor putea vedea schimbările făcute de noi. Vrem, așadar, ca modificările făcute local să se găsească și remote. Adică să publicăm commiturile din repository-ul local în repository-ul remote. Realizăm publicarea prin operația push.
Vom vedea în următoarele secțiuni care sunt pașii pentru a crea un commit și pentru a-l publica.
În următoarele secțiuni vom lucra în repository-ul array-sorting-algorithms
creat în secțiunea Introducere în Git și GitHub
. Vom crea, pas cu pas, un proiect software scris în limbajul de programare C, care conține mai mulți algoritmi de sortare a unui vector de elemente întregi.
Punctual, în această secțiune, vom crea fișierul README
al proiectului și scheletul de cod pentru algoritmii de sortare Bubble Sort, Merge Sort și Radix Sort. Vom crea commituri în repository-ul local pentru fiecare schimbare, după care vom publica commiturile astfel încât schimbările să fie vizibile și pe GitHub, în repository-ul remote.
Reamintire
O bună practică, prezentă în majoritatea proiectelor software, este să adăugăm un fișier README
în care se află informații despre un proiect. Spre exemplu, în README
se află informații despre ce funcționalități are proiectul nostru, cum se compilează un proiect, cum se rulează, pe ce tip de platforme poate fi rulat etc.
Un fișier README
este un fișier text. Îl putem crea și îi putem adăuga titlul Sorting Algorithms for Beginners
folosind un editor sau, mai simplu și mai direct, folosind comanda de mai jos:
student@uso:~/array-sorting-algorithms$ echo "# Sorting Algorithms for Beginners" > README.md student@uso:~/array-sorting-algorithms$ ls -a ./ ../ .git/ README.md
#
din fața textului Sorting Algorithms for Beginners
are rol de a formata textul sub formă de titlu. Nu intrăm în mai multe detalii aici pentru că nu face obiectul cărții.
Folosim extensia .md
care semnalează un fișier de tip Markdown. Facem acest lucru deoarece pe GitHub fișierele README
sunt afișate în format Markdown. Acest format este simplu de înțeles, însă nu face obiectul acestei cărți, deci nu vom insista pe înțelegerea lui.
Acum avem în repository un nou fișier: README.md
. Vrem să reținem acest lucru în repository prin crearea unui commit, primul.
Pașii creării unui commit sunt următorii:
Detaliem acești pași în continuare.
Prin starea repository-ului înțelegem forma la care am adus proiectul prin modificările noastre. Aceasta include ce fișiere am creat, modificat sau șters de la ultimul commit. Ne interesează întotdeauna starea repository-ului pe care lucrăm.
Pentru a verifica starea repository-ului folosim comanda git status
:
student@uso:~/array-sorting-algorithms$ git status On branch master No commits yet Untracked files: (use "git add <file>..." to include in what will be committed) README.md
Prima linie afișată On branch master
se referă la branch-ul master
local. Vom discuta în secțiunea Lucrul pe branch-uri
despre branch-uri.
A doua linie afișată No commits yet
ne spune că nu am făcut până acum niciun commit, adică am pornit de la un repository gol.
În ultima parte a outputului se află o listă de fișiere untracked
, adică lista fișierelor pe care Git le vede ca nou adăugate în repository-ul curent, dar pe care nu le monitorizează încă. Acest lucru înseamnă că, deocamdată, orice modificare vom face asupra acestor fișiere nu va fi urmărită (tracked) de Git. În cazul nostru, fișierul aflat în starea untracked este README.md
.
Un commit va conține o listă de modificări: fișiere adăugate, fișiere șterse, conținut modificat. Un pas intermediar în crearea unui commit este pregătirea modificărilor ce vor fi parte din commit. Acest pas de pregătire înseamnă să adăugăm (add) aceste modificări într-o zonă de lucru pentru Git, numită staging area.
În cazul nostru, vrem să adăugăm fișierul README.md
în staging area. Facem acest lucru folosind comanda git add
:
student@uso:~/array-sorting-algorithms$ git add README.md
Verificăm ce s-a schimbat în urma adăugării fișierului README.md
în staging folosind comanda git status
:
student@uso:~/array-sorting-algorithms$ git status On branch master No commits yet Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: README.md
Primele 2 mesaje afișate au rămas neschimbate. Partea interesantă apare la ultima parte a outputului. Vedem că mesajul a devenit Changes to be commited
. Acest lucru înseamnă că acum Git urmărește noile modificări și așteaptă ca modificările să fie adunate într-un commit.
Acum vrem ca modificările de mai sus să ajungă în repository. Pentru aceasta creăm un commit folosind comanda git commit
:
student@uso:~/array-sorting-algorithms$ git commit -m "Add README file" [master (root-commit) b2a590a] Add README.md 1 file changed, 1 insertion(+) create mode 100644 README.md student@uso:~/array-sorting-algorithms$ git status On branch master nothing to commit, working tree clean
Am folosit descrierea Add README file
la comanda git commit
drept mesaj de commit2). Aceasta este o descriere succintă a modificărilor făcute prin acest commit.
În continuare vom adăuga scheletul de cod pentru algoritmul Bubble Sort în repository. Vom crea un nou fișier cod sursă C bubble-sort.c
și vom scrie în el scheletul de cod pentru algoritm. Vom crea un nou commit care va conține fișierul bubble-sort.c
. Pentru aceasta vom folosi un editor, precum nano, ca în imaginea de mai jos:
Conținutul fișierului bubble-sort.c
este:
#include <stdio.h> static void sort(void) { // TODO: add bubble sort algorithm here } int main() { return 0; }
Mai sus am creat un commit cu fișierul bubble-sort.c
urmând pași similari cu cei din secțiunea Crearea primului commit
:
student@uso:~/array-sorting-algorithms$ git status (...) student@uso:~/array-sorting-algorithms$ git add bubble-sort.c student@uso:~/array-sorting-algorithms$ git status (...) student@uso:~/array-sorting-algorithms$ git commit -m "Add Bubble Sort skeleton" (...)
radix-sort.c
cu următorul conținut:#include <stdio.h> static void sort(void) { // TODO: add radix sort algorithm here } int main() { return 0; }
radix-sort.c
. Folosiți următorul mesaj de commit: Add Radix Sort algorithm skeleton
.git log
. Detaliem outputul comenzii git log
în subsecțiunea Verificarea istoricului de commituri
.merge-sort.c
cu următorul conținut:#include <stdio.h> static void sort(void) { // TODO: add merge sort algorithm here } int main() { return 0; }
merge-sort.c
. Folosiți următorul mesaj de commit: Add Merge Sort algorithm skeleton
.git log
.
Până acum am creat commituri care conțineau un fișier nou creat. În această secțiune vom modifica conțintului fișierului README.md
și vom crea un nou commit, așa cum apare în comenzile de mai jos:
student@uso:~/array-sorting-algorithms$ echo "We implement 3 sorting algorithms for integer arrays." >> README.md student@uso:~/array-sorting-algorithms$ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: README.md no changes added to commit (use "git add" and/or "git commit -a") student@uso:~/array-sorting-algorithms$ git add README.md student@uso:~/array-sorting-algorithms$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: README.md student@uso:~/array-sorting-algorithms$ git commit -m "Update README with project explanation" [master 247b87f] Update README with project explanation 1 file changed, 1 insertion(+)
Spre deosebire de secțiunea Crearea unui nou commit
, unde comanda git status
arăta că fișierul modificat (în acel caz, bubble-sort.c
) este nou (new file), acum comanda git status
arată că fișierul modificat (în acest caz, README.md
) a fost modificat (modified). Deși apare această diferență în outputul comenzii git status
, pașii pentru crearea unui commit care conține un fișier nou sau unul deja existent (dar modificat) sunt aceiași.
README.md
în # Sorting Algorithm for Integer Arrays
.README.md
. Folosiți următorul mesaj de commit: Update README title
.
La orice pas al dezvoltării proiectului vrem să știm în ce stadiu ne aflăm ca să ne dăm seama ce am făcut deja și ce trebuie să mai facem în continuare. De aceea folosim un sistem de versionare a codului, în cazul nostru Git
. Verificăm istoricul commiturilor folosind comanda git log
:
student@uso:~/array-sorting-algorithms$ git log commit 66b7c5fabb93b521326e6cd9ff219a06a3aec064 (HEAD -> master) Author: Liza Babu <lizababu@example.com> Date: Thu Sep 24 10:40:06 2020 -0700 Update README title commit 247b87f3f317816a204c4512f6fd9914527a03ad Author: Liza Babu <lizababu@example.com> Date: Thu Sep 24 09:50:30 2020 -0700 Update README with project explanation commit 3c835b0d8e7fc88ef45dfd3681867c21b75ed588 Author: Liza Babu <lizababu@example.com> Date: Thu Sep 24 09:45:13 2020 -0700 Add Merge Sort algotihm skeleton commit b92a52c0fc5d66dce4b2562114cc84ea326b2763 Author: Liza Babu <lizababu@example.com> Date: Thu Sep 24 09:44:36 2020 -0700 Add Radix Sort algotihm skeleton commit f65a7fbe8bbe1b36ba5c8e16607456a879bfb6fa Author: Liza Babu <lizababu@example.com> Date: Thu Sep 24 09:21:49 2020 -0700 Add Bubble Sort algorithm skeleton commit b2a590a8637f1eab96e557334dbd4be14bf95833 Author: Liza Babu <lizababu@example.com> Date: Thu Sep 24 09:09:51 2020 -0700 Add README file
Navigați prin outputul comenzii git log
prin intermediul săgeților sus/jos. Apăsați tasta q când ați terminat de inspectat.
În cazul autorului acestui capitol, numele, prenumele și emailul sunt Liza Babu <lizababu@example.com>
, așa cum apare în exemplul de mai sus: Author: Liza Babu <lizababu@example.com>
.
Fiecare commit este identificat unic printr-un cod, numit cod hash3). Discutăm în continuare despre ultimul commit din listă. Acesta are codul hash 66b7c5fabb93b521326e6cd9ff219a06a3aec064
și mesajul de commit Update README title
.
Acum vedem că repository-ul indică spre acest nou commit. Ne dăm seama de acest lucru pentru că HEAD
se află în dreptul commitului tocmai făcut. HEAD
ne indică starea repository-ului, adică ne arată care este ultimul commit pe care l-am făcut în repository.
Vrem să publicăm pe GitHub toate schimbările făcute, pentru a fi vizibile și altor colaboratori ai proiectului. Publicăm commitul folosind comanda git push
:
git push
aveți nevoie de un token de acces pe care îl veți folosi în locul parolei. Urmăriți tutorialul de aici pentru crearea unui token.
Atenție! Rețineți token-ul deoarece acesta este afișat o singură dată.
student@uso:~/array-sorting-algorithms$ git push origin master Counting objects: 18, done. Delta compression using up to 2 threads. Compressing objects: 100% (16/16), done. Writing objects: 100% (18/18), 1.95 KiB | 222.00 KiB/s, done. Total 18 (delta 3), reused 0 (delta 0) remote: Resolving deltas: 100% (3/3), done. To https://github.com/lizababu/array-sorting-algorithms.git * [new branch] master -> master
În felul acesta commiturile locale au fost publicate (“împinse”, push) din repository-ul local în repository-ul remote identificat de origin
. Commiturile locale se aflau pe branch-ul master din repository-ul local și au fost publicate tot în branch-ul master al repository-ului origin. Vorbim despre branch-uri în secțiunea Lucrul pe branch-uri
.
Ca să verificăm publicarea commiturilor, folosim interfața GitHub:
În lucrul cu Git / GitHub, există bune practici pe care recomandăm să le urmăm.
Atunci când ne apucăm de lucru vrem să sincronizăm repository-ul local cu cel remote. Pot apărea diferențe în momentul în care altcineva a publicat schimbări remote după ce am făcut noi ultima sincronizare. În momentul în care cineva a publicat modificări asupra unei secvențe de cod pe care și noi o modificăm, apar conflicte. Conflictele trebuie rezolvate.
Facem acest lucru prin operația pull
, care aduce local toate modificările și încearcă să rezolve conflicetele în mod automat4). Dacă rezolvarea conflictelor nu se poate face automat, trebuie să ne ocupăm de acest pas.
pull
nu a fost necesară.