This is an old revision of the document!
Un dezvoltator vrea să lucreze la o funcționalitate nouă, care poate destabiliza proiectul. Pentru aceasta creează o ramură de dezvoltare nouă (branch) pe care face commituri noi. Ulterior, dacă funcționalitatea este utilă, va fi adăugată în proiect prin unificarea acestui branch (merge); altfel branch-ul va fi șters.
Un repository Git are un branch principal de dezvoltare, numit master. Branch-ul master
este branch-ul implicit cu care lucrăm, în care adăugăm commituri și în care vedem istoricul de commituri.
În acest moment istoricul de commituri este următorul:
student@uso:~/array-sorting-algorithms$ git log commit 66b7c5fabb93b521326e6cd9ff219a06a3aec064 (HEAD -> master, origin/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
O reprezentare vizuală a istoricului commiturilor este:
Root-commitul este primul commit din istoric (b2a590a8637f1eab96e557334dbd4be14bf95833, b2a590a)1). Toate celelalte commituri vin în continuarea acestuia. Spre exemplu, al doilea commit (f65a7fbe8bbe1b36ba5c8e16607456a879bfb6fa, f65a7fb) a avut la bază primul commit (b2a590a). Modificările au fost făcute peste commitul b2a590a.
Crearea unui commit nou pe un alt branch va modifica istoricul ca în imaginea de mai jos:
În acest moment, pe repository-ul nostru aveți un singur branch - master. În continuare vom lucra la proiectul nostru array-sorting-algorithms
, dar vom face schimbări de pe alte branch-uri.
În următoarea secțiune vom adăuga un fișier .gitignore
proiectului și vom adăuga implementarea pentru agloritmul Merge Sort.
În general adăugăm fișierul .gitignore
la un proiect de pe branch-ul master.
În secțiunea Adăugarea unui fișier .gitignore repository-ului
îl vom adăuga de pe un alt branch pe care îl numim add-gitignore
ca să ne obișnuim să folosim branch-uri.
De acum încolo, vom face toate modificările de pe un nou branch, diferit de branch-ul master2).
În această subsecțiune vom crea un nou branch numit add-gitignore
. Vom adăuga un fișier .gitignore
proiectului de pe acest branch.
Într-un proiect Git, scriem în fișierul .gitignore
nume de fișiere și directoare. Acestea sunt fișiere și directoare din directorul proiectului pe care nu vrem să le adăugăm în repository.
Spre exemplu, nu punem fișiere obiect și fișiere executabile în repository pentru că sunt fișiere generate pentru un anumit tip de sistem. Având codul sursă, putem genera fișierele obiect și executabile pe sistemul nostru.
Verificăm branch-ul pe care ne aflăm folosind comanda git branch
:
student@uso:~/array-sorting-algorithms$ git branch * master
Caracterul *
se află în dreptul branch-ului pe care ne aflăm, în cazul nostru master.
Creăm un nou branch numit add-gitignore
folosind comanda git branch
urmată de numele noului branch:
student@uso:~/array-sorting-algorithms$ git branch add-gitignore student@uso:~/array-sorting-algorithms$ git branch add-gitignore * master
Acum avem 2 branch-uri add-gitignore și master și ne aflăm pe branch-ul master.
Trecem pe branch-ul add-gitignore folosind comanda git checkout
:
student@uso:~/array-sorting-algorithms$ git checkout add-gitignore Switched to a new branch 'add-gitignore' student@uso:~/array-sorting-algorithms$ git branch * add-gitignore master
Avem 2 branch-uri add-gitignore și master și ne aflăm pe branch-ul add-gitignore.
În acest moment branch-ul add-gitignore nu diferă de branch-ul master. Când vom face schimbări (în formă de commituri), cele două branch-uri vor diverge.
Nu dorim să avem fișiere obiect în repository așa că vom configura Git să ignore aceste fișiere. Facem acest lucru prin adăugarea șirului *.o
în fișierul .gitignore
:
student@uso:~/array-sorting-algorithms$ echo "*.o" > .gitignore student@uso:~/array-sorting-algorithms$ ls -a . .. bubble-sort.c .git .gitignore merge-sort.c radix-sort.c README.md student@uso:~/array-sorting-algorithms$ git status On branch add-gitignore Untracked files: (use "git add <file>..." to include in what will be committed) .gitignore nothing added to commit but untracked files present (use "git add" to track)
Creăm un commit cu această modificare (git add
și git commit
) și îl publicăm (git push
):
student@uso:~/array-sorting-algorithms$ git add .gitignore student@uso:~/array-sorting-algorithms$ git status On branch add-gitignore Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: .gitignore student@uso:~/array-sorting-algorithms$ git commit -m "Add .gitignore file" [add-gitignore 988b188] Add .gitignore file 1 file changed, 1 insertion(+) create mode 100644 .gitignore student@uso:~/array-sorting-algorithms$ git push origin add-gitignore Counting objects: 3, done. Delta compression using up to 2 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 283 bytes | 70.00 KiB/s, done. Total 3 (delta 1), reused 0 (delta 0) remote: Resolving deltas: 100% (1/1), completed with 1 local object. remote: remote: Create a pull request for 'add-gitignore' on GitHub by visiting: remote: https://github.com/lizababu/array-sorting-algorithmss/pull/new/add-gitignore remote: To https://github.com/lizababu/array-sorting-algorithmss.git * [new branch] add-gitignore -> add-gitignore
Am publicat commitul în repository-ul remote pe branch-ul add-gitignore
. Odată cu publicarea commitului pe GitHub, a fost creat și branch-ul add-gitignore
în repository-ul remote.
Orice operație trebuie să fie urmată de o operație de verficare. Din grabă sau neatenție, putem face operații incorecte și este mai ușor să le remediem pe loc decât mai târziu. Spre exemplu, după crearea unui commit, verificăm statusul repository-ului și istoricul de commituri.
În secțiunea Adăugarea unui fișier .gitignore repository-ului
de mai sus am creat un commit pe branch-ul add-gitignore.
Ne amintim că este BAD PRACTICE să facem modificări direct pe branch-ul master.
Vrem ca modificarea făcută de noi, în acest caz crearea unui fișier gitignore, să se regăsească și pe branch-ul master. Facem acest lucru prin intermediul operației merge
, operație care unește două branch-uri: adică aduce conținutul unui branch pe un alt branch, în cazul nostru de pe add-gitignore pe master. Pentru a face acest lucru trebuie să fim pe branch-ul master, adică pe branch-ul în care vrem să integrăm schimbările.
Trecem pe branch-ul master folosind comanda git checkout
:
student@uso:~/array-sorting-algorithms$ git checkout master Switched to branch 'master'
Suntem pe branch-ul master local și ne asigurăm că este sincronizat cu cel remote folosind comanda git pull
:
student@uso:~/array-sorting-algorithms$ git pull origin master From https://github.com/lizababu/array-sorting-algorithmss * branch master -> FETCH_HEAD Already up to date.
Branch-ul master local este sincronizat cu cel remote (Already up to date). Integrăm branch-ul add-gitignore în branch-ul master folosind comanda git merge
:
student@uso:~/array-sorting-algorithms$ git merge add-gitignore Updating 66b7c5f..988b188 Fast-forward .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore student@uso:~/array-sorting-algorithms$ git status On branch master Your branch is ahead of 'origin/master' by 1 commit. (use "git push" to publish your local commits) nothing to commit, working tree clean
Acum avem pe repository-ul local un commit în plus față de repository-ul origin (Your branch is ahead of 'origin/master' by 1 commit), adică avem un commit care nu a fost publicat. Verificăm istoricul de commituri pentru a-l vedea folosind comanda git log
:
commit 988b188d2c6422a3162d1da25653f4682f7df6db (HEAD -> master, origin/add-gitignore, add-gitignore) Author: Liza Babu <lizababu@example.com> Date: Mon Sep 28 02:29:00 2020 -0700 Add .gitignore file commit 66b7c5fabb93b521326e6cd9ff219a06a3aec064 (origin/master, origin/HEAD) Merge: f59ba10 23d5cfa Author: Liza Babu <lizababu@example.com> Date: Thu Sep 24 10:40:06 2020 -0700 Update README title (...)
După integrarea branch-ului add-gitignore în branch-ul master vedem că ultimul commit (hash 988b188d2c6422a3162d1da25653f4682f7df6db) se află în istoric. Îl publicăm în repository-ul origin folosind comanda git push
:
student@uso:~/array-sorting-algorithms$ git push origin master Enumerating objects: 4, done. Counting objects: 100% (4/4), done. Delta compression using up to 4 threads Compressing objects: 100% (2/2), done. Writing objects: 100% (2/2), 296 bytes | 296.00 KiB/s, done. Total 2 (delta 0), reused 0 (delta 0), pack-reused 0 To https://github.com/lizababu/array-sorting-algorithms 5c982a1..1f553ab master -> master
Vedem commitul și pe GitHub ca în imaginea de mai jos pe branch-ul master:
După ce terminăm lucrul pe un branch, îl ștergem. Vom folosi noi ramuri de dezvoltare (branch-uri) pentru alte funcționalități, deci nu vom mai avea nevoie de branch-urile vechi.
În acestă secțiune vom șterge branch-ul add-gitignore atât din repository-ul local cât și din interfața GitHub.
Trebuie să ne aflăm pe un branch diferit față de cel pe care vrem să-l ștergem. Verificăm branch-ul pe care ne aflăm folosind comanda git branch
:
student@uso:~/array-sorting-algorithms$ git branch add-gitignore * master
Ne aflăm pe branch-ul master. Ștergem branch-ul add-gitignore din repository-ul local folosind comanda git branch -d
:
student@uso:~/array-sorting-algorithms$ git branch -d add-gitignore Deleted branch add-gitignore (was 988b188). student@uso:~/array-sorting-algorithms$ git branch * master
Am șters branch-ul add-gitignore din repository-ul local și am rămas doar cu branch-ul master. Ștergem acum branch-ul add-gitiginore și din repository-ul origin folosind comanda git push
:
student@uso:~/array-sorting-algorithms$ git push origin --delete add-gitignore To https://github.com/lizababu/array-sorting-algorithms.git - [deleted] add-gitignore
Vedem și din interfața GitHub că nu mai există branch-ul add-gitignore ca în imaginea de mai jos:
În această subsecțiune vom relua pașii prezentați în subsecțiunile anterioare. Vom lucra în continuare pe branch-uri. Vom adăuga o nouă linie în fișierul .gitignore
, vom crea un commit cu această schimbare și vom integra schimbările din branch-ul secundar în branch-ul master prin operația merge.
Creăm un branch numit update-gitiginore și ne mutăm pe el.
student@uso:~/array-sorting-algorithms$ git branch update-gitignore student@uso:~/array-sorting-algorithms$ git checkout update-gitignore Switched to branch 'update-gitignore'
Suntem pe branch-ul update-gitignore și adăugăm linia build/
în fișierul .gitignore
.
De obicei, într-un proiect vom avea un director în care punem fișierele generate (spre exemplu, fișierele excutabile). Astfel, punem doar numele directorului în .gitginore
și toate fișierele din el vor fi ignorate de Git.
Alternativa ar fi să adăugăm numele tuturor fișierelor executabile pe care le generăm în .gitignore
. Dezavantajul aici este că nu putem refolosi un fișier .gitignore
de la un proiect la altul pentru că numele executabilelor vor fi, cel mai probabil, diferite.
Putem face acest lucru folosind un editor text sau folosind următoarea comandă:
student@uso:~/array-sorting-algorithms$ echo "build/" >> .gitignore
Creăm un commit care să conțină modificărea din fișierul .gitignore
.
student@uso:~/array-sorting-algorithms$ git status On branch update-gitignore 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: .gitignore no changes added to commit (use "git add" and/or "git commit -a") student@uso:~/array-sorting-algorithms$ git add .gitignore student@uso:~/array-sorting-algorithms$ git status On branch update-gitignore Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: .gitignore student@uso:~/array-sorting-algorithms$ git commit -m "Update .gitignore content" [update-gitignore 6d5189f] Update .gitignore content 1 file changed, 1 insertion(+) student@uso:~/array-sorting-algorithms$ git log commit 6d5189fd7095a19a6ad9bddb8c95491b37d9e828 (HEAD -> update-gitignore) Author: Liza Babu <lizababu@example.com> Date: Mon Sep 28 11:47:36 2020 -0700 Update .gitignore content commit 988b188d2c6422a3162d1da25653f4682f7df6db (origin/master, master) Author: Liza Babu <lizababu@example.com> Date: Mon Sep 28 02:29:00 2020 -0700 Add .gitignore file commit 66b7c5fabb93b521326e6cd9ff219a06a3aec064 Author: Liza Babu <lizababu@example.com> Date: Thu Sep 24 10:40:06 2020 -0700 Update README title (...)
Am verificat istoricul de commituri și vedem că ultimul commit este cel cu identificatorul 6d5189fd7095a19a6ad9bddb8c95491b37d9e828, adică cel creat în această subsecțiune.
Publicăm commitul și în repository-ul origin, pentru ca acesta să fie vizibil și celorlalți colaboratori ai proiectului, folosind comanda git push
student@uso:~/array-sorting-algorithms$ git push origin update-gitignore Counting objects: 3, done. Delta compression using up to 2 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 295 bytes | 295.00 KiB/s, done. Total 3 (delta 1), reused 0 (delta 0) remote: Resolving deltas: 100% (1/1), completed with 1 local object. remote: remote: Create a pull request for 'update-gitignore' on GitHub by visiting: remote: https://github.com/lizababu/array-sorting-algorithms/pull/new/update-gitignore remote: To https://github.com/lizababu/array-sorting-algorithms.git * [new branch] update-gitignore -> update-gitignore
Revenim pe branch-ul master și efectuăm operația merge între branch-ul update-gitignore și master.
student@uso:~/array-sorting-algorithms$ git checkout master Switched to branch 'master' student@uso:~/array-sorting-algorithms$ git merge update-gitignore Updating 988b188..6d5189f Fast-forward .gitignore | 1 + 1 file changed, 1 insertion(+) student@uso:~/array-sorting-algorithms$ git push origin master Enumerating objects: 4, done. Counting objects: 100% (4/4), done. Delta compression using up to 4 threads Compressing objects: 100% (2/2), done. Writing objects: 100% (2/2), 296 bytes | 296.00 KiB/s, done. Total 2 (delta 0), reused 0 (delta 0), pack-reused 0 To https://github.com/lizababu/array-sorting-algorithms 5c982a1..1f553ab master -> master
Ștergem branch-ul update-gitignore în repository-ul local și în cel origin.
student@uso:~/array-sorting-algorithms$ git branch -d update-gitignore Deleted branch update-gitignore (was 6d5189f). student@uso:~/array-sorting-algorithms$ git push origin --delete update-gitignore To https://github.com/lizababu/array-sorting-algorithms.git - [deleted] update-gitignore
Vedem și din interfața GitHub că nu mai există branch-ul update-gitignore ca în imaginea de mai jos:
merge-sort-implementation
.merge-sort-implementation
.#include <stdio.h> #define MAX_LEN 100 static void merge(int arr[], int left, int mid, int right) { int i, j, k; int n1 = mid - left + 1; int n2 = right - mid; int aux_left[n1], aux_right[n2]; for (i = 0; i < n1; i++) aux_left[i] = arr[left + i]; for (j = 0; j < n2; j++) aux_right[j] = arr[mid + 1 + j]; i = 0; j = 0; k = l; while (i < n1 && j < n2) { if (aux_left[i] <= aux_right[j]) { arr[k] = aux_left[i]; i++; } else { arr[k] = aux_right[j]; j++; } k++; } while (i < n1) { arr[k] = aux_left[i]; i++; k++; } while (j < n2) { arr[k] = R[j]; j++; k++; } } static void sort(int arr[], int left, int right) { if (left < right) { int mid = left + (right - left) / 2; sort(arr, left, mid); sort(arr, mid + 1, right); merge(arr, left, mid, right); } } static void print_array(int *arr, int len) { int i; for (i = 0; i < len; i++) { printf("%d ", arr[i]); } printf("\n"); } int main() { int arr[MAX_LEN], len, i; printf("What's the length of the array? Maximum lenght is %d\n", MAX_LEN); scanf("%d", &len); printf("Gimme the %d elements\n", len); for (i = 0; i < len; i++) { scanf("%d", &arr[i]); } printf("Nonsorted array: "); print_array(arr, len); sort(arr, len); printf("Sorted array: "); print_array(arr, len); return 0; }
Add Merge Sort implementation
.git push origin merge-sort-implementation
.Atunci când contribuim la un proiect putem să lucrăm fie pe branch-ul master, fie pe un alt branch. Este considerat BAD PRACTICE să lucrăm pe branch-ul master din mai multe motive:
Crearea unui Pull Request
, termenul de pull request, folosit pentru code review.Note de subsol
În momentul în care vrem să adăugăm o funcționalitate nouă unui proiect software pe GitHub este recomandat să o facem printr-un Pull Request, prescurtat PR. Un Pull Request este o cerere de modificare a repository-ului. Alți colaboratori ai proiectului vor recenza modificările și vor aproba, vor sugera schimbări sau vor respinge această cerere. În momentul în care un Pull Request este aprobat, schimbările propuse în Pull Request pot fi integrate în proiect, adică se va putea face merge între codul sursă curent și noile modificări.
Practic, un Pull Request este o interfață GitHub de contribuit la proiecte software, interfață bazată pe lucrul cu branch-uri Git.
Spunem că deschidem un Pull Request care urmează să fie integrat într-un anumit branch. De obicei acel branch este master. În acest tutorial vom deschide un Pull Request care urmează să fie integrat în branch-ul master.
În secțiunea Lucrul pe branch-uri
am adus modificările de pe branch-ul add-gitignore pe branch-ul master prin operația merge. În această secțiune vom integra schimbările prin intermediul unui Pull Request3) urmând pașii din subsecțiunea Pași Pull Request
.
Folosirea unui Pull Request în loc de a efectua o operație merge vine cu mai multe beneficii:
Recenzii și recenzenți
cum adăugăm recenzenți.
Ca să avem o contribuție prin Pull Request, în mod uzual se urmează pașii:
În următoarele subsecțiuni vom implementa algoritmul Bubble Sort și vom modifica repository-ul array-sorting-algorithms
prin intermediul unui Pull Request.
Pentru a putea deschide un Pull Request, trebuie să lucrăm pe un branch diferit față de cel în care vrem să integrăm schimbările. Vom lucra pe un nou branch, diferit de branch-ul master.
Creăm un branch numit bubble-sort-implementation folosind comanda git branch
:
student@uso:~/array-sorting-algorithms$ git branch * master student@uso:~/array-sorting-algorithms$ git branch bubble-sort-implementation student@uso:~/array-sorting-algorithms$ git checkout bubble-sort-implementation Switched to a new branch 'bubble-sort-implementation' student@uso:~/array-sorting-algorithms$ git branch * bubble-sort-implementation master
Până la acest moment am făcut deja o serie de commituri în repository-ul nostru.
student@uso:~/array-sorting-algorithms$ git log commit 6d5189fd7095a19a6ad9bddb8c95491b37d9e828 (HEAD -> bubble-sort-implementation, origin/master, master) Author: Liza Babu <lizababu@example.com> Date: Mon Sep 28 11:47:36 2020 -0700 Update .gitignore content commit 988b188d2c6422a3162d1da25653f4682f7df6db Author: Liza Babu <lizababu@example.com> Date: Mon Sep 28 02:29:00 2020 -0700 Add .gitignore file (...)
Vedem același istoric de commituri și prin intermediul interfeței grafice GitHub ca în imaginea de mai jos:
În următoarea secțiune vom face încă un commit.
Vom actualiza fișierul bubble-sort.c
cu implementarea algoritmului ales. Modificăm fișierul bubble-sort.c
astfel încât conținutul său să fie următorul:
#include <stdio.h> #define MAX_LEN 100 static void swap(int *x, int *y) { int tmp = *x; *x = *y; *y = tmp; } static void bubble_sort(int *array, int len) { int i, j; for (i = 0; i < len - 1; i++) for (j = 0; j < len - 1; j++) if (array[j] > array[j + 1]) swap(&array[j], &array[j + 1]); } static void print_array(int *array, int len) { int i; for (i = 0; i < len; i++) { printf("%d ", array[i]); } printf("\n"); } int main() { int array[MAX_LEN], len, i; printf("What's the length of the array? Maximum lenght is %d\n", MAX_LEN); scanf("%d", &len); printf("Gimme the %d elements\n", len); for (i = 0; i < len; i++) { scanf("%d", &array[i]); } printf("Nonsorted array: "); print_array(array, len); bubble_sort(array, len); printf("Sorted array: "); print_array(array, len); return 0; }
Algoritmul de mai sus sortează crescător un vector de numere întregi citit de la tastatură. Vrem să precizăm acest lucru și în fișierul README.md
.
Modificăm fișierul README.md
ca să aibă conținutul de mai jos:
# Sorting Algorithm for Integer Arrays We implement 3 sorting algorithms for integer arrays. ## Bubble Sort The Bubble Sort algorithm sorts the array in ascending order. The algorithm is implemented in C.
Creăm un commit cu schimbările făcute. Adăugăm întâi modificările în zona de lucru (staging area) folosind comanda git add
:
student@uso:~/array-sorting-algorithms$ git status On branch bubble-sort-implementation 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 modified: bubble-sort.c 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 add bubble-sort.c student@uso:~/array-sorting-algorithms$ git status On branch bubble-sort-implementation Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: README.md modified: bubble-sort.c
Creăm un commit cu modificările din staging area:
student@uso:~/array-sorting-algorithms$ git commit -m "Add Bubble Sort implementation, update README accordingly" [bubble-sort-implementation d400958] Add Bubble Sort implementation, update README accordingly 2 files changed, 61 insertions(+), 11 deletions(-) rewrite bubble-sort.c (82%) student@uso:~/array-sorting-algorithms$ git log commit d400958efb8a49cd9b6050fc03783b218891d165 (HEAD -> bubble-sort-implementation) Author: Liza Babu <lizababu@example.com> Date: Tue Sep 29 01:59:27 2020 -0700 Add Bubble Sort implementation, update README accordingly commit 6d5189fd7095a19a6ad9bddb8c95491b37d9e828 (origin/master, master) Author: Liza Babu <lizababu@example.com> Date: Mon Sep 28 11:47:36 2020 -0700 Update .gitignore content
Acum ultimul commit din istoric pe branch-ul bubble-sort-implementation este d400958efb8a49cd9b6050fc03783b218891d165.
Publicăm commitul în repository-ul origin folosind comanda git push
:
student@uso:~/array-sorting-algorithms$ git push origin bubble-sort-implementation Counting objects: 4, done. Delta compression using up to 2 threads. Compressing objects: 100% (4/4), done. Writing objects: 100% (4/4), 924 bytes | 924.00 KiB/s, done. Total 4 (delta 0), reused 0 (delta 0) remote: remote: Create a pull request for 'bubble-sort-implementation' on GitHub by visiting: remote: https://github.com/lizababu/array-sorting-algorithms/pull/new/bubble-sort-implementation remote: To https://github.com/lizababu/array-sorting-algorithms.git * [new branch] bubble-sort-implementation -> bubble-sort-implementation
Linkul https://github.com/{username}/array-sorting-algorithms/pull/new/bubble-sort-implementation
este link la Pull Request.
În loc de {username}
veți avea username-ul vostru de pe GitHub. Pentru autorul acestui capitol este lizababu
.
Accesăm linkul PR-ului: https://github.com/{username}/array-sorting-algorithms/pull/new/bubble-sort-implementation
În acest moment s-a deschis o nouă pagină care arată că în imaginea de mai jos.
Mai jos explicăm semnificația celor mai importante componente prezente în imagine.
În imaginea de mai jos vedem o parte a interfeței GitHub în care putem lăsa un comentariu în care să descriem (chiar și mai în detaliu decât într-un mesaj de commit) ce schimbări am făcut.
În cazul nostru, comentariul poate conține detalii despre implementarea algoritmului. O descriere potrivită poate fi:
I implemented a non-optimized Bubble Sort algorithm in C. The program sorts an integer array in ascending order.
Ca să finalizăm PR-ul, modificările din acesta trebuie să fie adăugate într-un branch, cel mai adesea în branch-ul master4).
În acest tutorial vom folosi branch-ul master
ca în imaginea de mai jos:
Acum creăm Pull Requestul apăsând pe butonul Create pull request
ca în imaginea de mai jos:
Folosirea PR-urilor ne aduce un beneficiu important: putem primi feedback pe modificările aduse. Din interfața grafică GitHub putem adăuga recenzenți care să dea feedback pe modificări. Recenzenții fac parte din colaboratorii proiectului.
În acest tutorial nu vom adăuga recenzenți la PR-ul creat.
După mai multe runde de feedback și aplicarea acestuia, PR-ul va fi gata de integrat în branch-ul master.
Acest scenariu ping-pong se va repeta până când voi, împreună cu recenzenții, ajungeți la concluzia că schimbările pot fi integrate.
Acum vom face operația merge a PR-ului. Apăsăm mai întâi butonul Merge pull request
după care butonul Confirm merge
ca în imaginea de mai jos.
Am făcut operația merge în repository-ul remote (origin). Avem pe branch-ul master implementarea algoritmului Bubble Sort. Actualizăm și repository-ul local folosind comanda git pull
:
student@uso:~/array-sorting-algorithms$ git checkout master Switched to branch 'master' student@uso:~/array-sorting-algorithms$ git pull origin master remote: Enumerating objects: 1, done. remote: Counting objects: 100% (1/1), done. remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 Unpacking objects: 100% (1/1), done. From https://github.com/lizababu/array-sorting-algorithms * branch master -> FETCH_HEAD 6d5189f..95c59cd master -> origin/master Updating 6d5189f..95c59cd Fast-forward README.md | 7 +++++++ bubble-sort.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 55 insertions(+), 5 deletions(-)
Odată făcută operația merge
, putem șterge branch-ul pe care am lucrat apăsând pe butonul Delete branch
.
Această operație va șterge branch-ul doar pe GitHub. Ca să ștergem branch-ul bubble-sort-implementation și din repository-ul local folosim comanda git branch -d
:
student@uso:~/array-sorting-algorithms$ git branch -d bubble-sort-implementation Deleted branch bubble-sort-implementation (was d400958). student@uso:~/array-sorting-algorithms$ git branch * master
În final am ajuns să integrăm modificările de pe branch-ul bubble-sort-implementation în branch-ul master prin intermediul unui Pull Request. Am șters branch-ul bubble-sort-implementation.
Veți folosi repository-ul array-sorting-algorithms
pentru rezolvarea acestui exercțiu.
Creați un Pull Request urmând pașii descriși mai sus în care să adăugați algoritmul de sortare Radix Sort. De această dată veți modifica fișierul radix-sort.c
cu următorul conținut:
#include <stdio.h> #define MAX_LEN 100 static int get_max(int array[], int n) { int max = array[0]; for (int i = 1; i < n; i++) if (array[i] > max) max = array[i]; return max; } static void count_sort(int array[], int n, int exp) { int output[n]; int i, count[10] = {0}; for (i = 0; i < 10; i++) { count[i] = 0; } for (i = 0; i < n; i++) { count[(array[i] / exp) % 10]++; } for (i = 1; i < 10; i++) { count[i] += count[i - 1]; } for (i = n - 1; i >= 0; i--) { output[count[(array[i] / exp) % 10] - 1] = array[i]; count[(array[i] / exp) % 10]--; } for (i = 0; i < n; i++) array[i] = output[i]; } static void sort(int array[], int n) { int m = get_max(array, n); for (int exp = 1; m / exp > 0; exp *= 10) count_sort(array, n, exp); } static void print_array(int *array, int len) { int i; for (i = 0; i < len; i++) { printf("%d ", array[i]); } printf("\n"); } int main() { int array[MAX_LEN], len, i; printf("What's the length of the array? Maximum lenght is %d\n", MAX_LEN); scanf("%d", &len); printf("Gimme the %d elements\n", len); for (i = 0; i < len; i++) { scanf("%d", &array[i]); } printf("Nonsorted array: "); print_array(array, len); sort(array, len); printf("Sorted array: "); print_array(array, len); return 0; }
Pe parcursul creării acestui Pull Request țineți cont de următoarele:
README.md
în care să descrieți algoritmul pe care l-ați implementat (Radix Sort).git status
) și istoricul de commituri (git log
).Alternativa la a crea un Pull Request ar fi să lucrăm direct pe branch-ul master.
Așa cum am menționat și în secțiunile anterioare, este BAD-PRACTICE să lucrăm direct pe branch-ul master din mai multe motive:
Note de subsol
base: master
. Vor fi afișate toate branch-urile din acest repository și vom putea alege în ce branch să integrăm PR-ul.