Differences

This shows you the differences between two versions of the page.

Link to this comparison view

poo-ca-cd:resurse-utile:tutorial-git [2022/11/15 10:47]
florian_luis.micu [Descriere]
poo-ca-cd:resurse-utile:tutorial-git [2023/11/12 17:55] (current)
florian_luis.micu [Clone/Init]
Line 1: Line 1:
 ====== Tutorial Git ====== ====== Tutorial Git ======
  
-  * Responsabil:​ Florian-Luis Micu +  * Responsabil: ​[[miculuis1@gmail.com | Florian-Luis Micu]] 
-  * Data publicării: ​14.11.2022 +  * Data publicării: ​15.11.2022 
-  * Data ultimei modificări: ​14.11.2022+  * Data ultimei modificări: ​12.11.2023
  
 ===== Descriere ===== ===== Descriere =====
Line 23: Line 23:
 </​note>​ </​note>​
  
-<note tip>​Există un tutorial dedicat pentru integrarea tool-ului Git în IntelliJ și vi-l punem la dispoziție la acest [[https://​www.jetbrains.com/​help/​idea/​set-up-a-git-repository.html#​put-existing-project-under-Git|link]].</​note>​+<note tip>​Există un tutorial dedicat pentru integrarea tool-ului Git în IntelliJ și vi-l punem la dispoziție la acest [[https://​www.jetbrains.com/​help/​idea/​set-up-a-git-repository.html#​put-existing-project-under-Git|link]]. Secțiunile următoare au rolul de a vă ajuta să înțelegeți mai bine cum funcționează Git-ul în realitate.</​note>​
  
 ==== Crearea unui repository ==== ==== Crearea unui repository ====
Line 109: Line 109:
  
 <note important>​ <note important>​
-  ​* Dacă folosiți comanda "​init"​ va trebui să specificați URL-ul repo-ului vostru atunci când veți rula comanda "​push"​. +  * Mesajul de output ​al comenzii "​init" ​vă precizează că s-a inițializat folder-ul **"​.git"​** și că s-a ales un **branch default** numit "​master"​ pe care îl puteți redenumi voi conform comenzilor din output
-  ​* Mesajul de output vă precizează că s-a inițializat folder-ul **"​.git"​** și că s-a ales un **branch default** numit "​master"​ pe care îl puteți redenumi voi conform comenzilor din output.+  * După ce vă clonați/​inițializați repository-ul o să aveți un folder **ascuns** numit "​.git"​ care reține date despre repository și toate schimbările voastre locale.
 </​note>​ </​note>​
 +
 +Dacă alegeți să faceți un repository local folosind comanda "git init", va fi nevoie să îl legați pe acesta la un repository din cloud pentru a putea avea proiectul vostru sincronizat și disponibil pe mai multe device-uri. Înainte să începeți procesul de legare, trebuie să vă creați un repository, urmând ca apoi să rulați comenzile de mai jos cu URL-ul repository-ului creat de voi.
 +
 +<code bash>
 +student@student:​~$ git remote add origin https://​github.com/​github_id/​test_repo.git
 +</​code>​
 +
 +Pentru a explica mai bine ce face comanda de mai sus o vom sparge în mai multe bucăți:
 +  - git remote -> dorim să lucrăm cu conexiuni la alte repository-uri
 +  - add -> dorim să adăugăm o conexiune externă
 +  - origin -> alias pentru un repository aflat în cloud
 +  - URL -> link-ul către repository-ul pe care dorim să îl urmărim
 +
 +După ce am creat conexiunea către repository-ul nostru din cloud, când dorim să aducem modificările locale în cloud (acțiune asociată comenzii "git push") va trebui să specificăm care este branch-ul nostru local main (sau master) și care este branch-ul repository-ului nostru main (sau master). După ce "​conectăm"​ branch-urile noastre, putem rula direct comanda "git push" pentru a trimite modificările noastre și în cloud. Pentru mai multe detalii legate de comanda "git push" și despre "​branch-uri"​ vă rugăm să citiți secțiunile de mai jos.
 +
 +<code bash>
 +student@student:​~$ git push --set-upstream origin master
 +Enumerating objects: 3, done.
 +Counting objects: 100% (3/3), done.
 +Writing objects: 100% (3/3), 205 bytes | 205.00 KiB/s, done.
 +Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
 +To https://​github.com/​luis6156/​wow.git
 + * [new branch] ​     master -> master
 +branch '​master'​ set up to track '​origin/​master'​.
 +</​code>​
  
 <note warning> <note warning>
-După ce vă clonați/​inițializați repository-ul o să aveți un folder **ascuns** numit "​.git"​ care reține date despre ​repo și toate schimbările voastre locale.+Dacă folosiți comanda "​init"​ va trebui să specificați neapărat URL-ul repository-ului vostru atunci când veți rula comanda "​push"​. 
 +</​note>​ 
 + 
 +<note tip> 
 +  * În cadrul temelor la POO noi o să verificăm existențfolder-ului "​.git"​ atunci când încărcați arhiva pe VmChecker. Pentru a vă verifica commit-urile o să rulăm comanda ​**git log**
 +  * Folder-ul ​"​.git" ​se crează automat atunci când rulați comanda "​init"​. 
 +  * Dacă nu vreți să folosiți comanda "​init",​ puteți să vă creați un repository nou pe GitHub după care să vă incărcați scheletul pentru temă direct în repo folosind interfața grafică (selectați butonul "add files"​). După ce ați încărcat scheletul puteți să vă clonați repository-ul pe device folosind comanda "​clone",​ urmând ca folder-ul "​.git"​ să fie generat automat. 
 +  * Dacă ați ales să rulați comanda "​init"​ în cadrul folderului unde există scheletul vă recomandăm să vă faceți ​și un repository **privat** pe care să îl legați la folder-ul vostru local "​.git"​ conform informațiilor de mai sus.
 </​note>​ </​note>​
  
Line 665: Line 697:
  
 Ca să înțelegem când să folosim merge/​rebase este important să observăm că un developer nu poate vedea în urma unui rebase de unde vin commit-urile "​A"​ și "​B"​. Deci putem să tragem concluzia că este mai bine să folosim "​merge"​ când log-urile sunt importante și când alți developeri au acces la branch-ul sursă, în schimb folosim "​rebase"​ când log-urile nu sunt importante și când alți developeri nu au acces la branch-ul sursă. Ca să înțelegem când să folosim merge/​rebase este important să observăm că un developer nu poate vedea în urma unui rebase de unde vin commit-urile "​A"​ și "​B"​. Deci putem să tragem concluzia că este mai bine să folosim "​merge"​ când log-urile sunt importante și când alți developeri au acces la branch-ul sursă, în schimb folosim "​rebase"​ când log-urile nu sunt importante și când alți developeri nu au acces la branch-ul sursă.
 +
 +==== Conflicte ====
 +
 +Atunci când dorim să facem o operație de "​merge"​ sau "​rebase"​ putem să avem conflicte între branch-ul sursă și branch-ul destinație. Acest conflict poate apărea în situația în care noi modificăm un fișier pe un branch și un coleg modifică diferit același fișier pe alt branch și apoi dorim să îmbinăm cele două branch-uri.
 +
 +Pentru a ilustra și rezolva această situație o să presupunem că avem branch-urile "​test_src"​ și "​test_dst"​ în care modificăm fișierul "​InlineEngine.java"​. ​
 +
 +În branch-ul "​test_dst"​ avem:
 +<code Java>
 +class InlineEngine extends Engine {
 +   ​private Boolean isInverted;
 +
 +   ​public InlineEngine(int pistons, String shape, Boolean isInverted) {
 +      super(pistons,​ shape);
 +      this.isInverted = isInverted;
 +   }
 +
 +   ​public Boolean getIsInverted() {
 +      return isInverted;
 +   }
 +
 +   // METODA ADAUGATA IN AMBELE BRANCH-URI CU MICI DIFERENTE
 +   ​public void methodFromDST() {
 +      System.out.println("​BarFoo"​);​
 +   }
 +}
 +</​code>​
 +
 +În branch-ul "​test_src"​ avem:
 +<code Java>
 +class InlineEngine extends Engine {
 +   ​private Boolean isInverted;
 +
 +   ​public InlineEngine(int pistons, String shape, Boolean isInverted) {
 +      super(pistons,​ shape);
 +      this.isInverted = isInverted;
 +   }
 +
 +   ​public Boolean getIsInverted() {
 +      return isInverted;
 +   }
 +
 +   // METODA ADAUGATA IN AMBELE BRANCH-URI CU MICI DIFERENTE
 +   ​public void methodFromSRC() {
 +      System.out.println("​FooBar"​);​
 +   }
 +}
 +</​code>​
 +
 +Acum dacă încercăm să facem merge în "​test_dst":​
 +
 +<code bash>
 +student@student:​~$ git status
 +On branch test_dst
 +Your branch is up to date with '​origin/​test_dst'​.
 +
 +nothing to commit, working tree clean
 +
 +student@student:​~$ git merge test_src
 +Auto-merging InlineEngine.java
 +CONFLICT (content): Merge conflict in InlineEngine.java
 +Automatic merge failed; fix conflicts and then commit the result.
 +
 +student@student:​~$ git status
 +On branch test_dst
 +Your branch is up to date with '​origin/​test_dst'​.
 +
 +You have unmerged paths.
 +  (fix conflicts and run "git commit"​)
 +  (use "git merge --abort"​ to abort the merge)
 +
 +Unmerged paths:
 +  (use "git add <​file>​..."​ to mark resolution)
 + both modified: ​  ​InlineEngine.java
 +
 +no changes added to commit (use "git add" and/or "git commit -a")
 +</​code>​
 +
 +Git ne avertizează că au fost făcute modificări pe ambele branch-uri în același fișier și nu știe ce modificări să păstreze în urma operației de "​merge"​. Ca să rezolvăm această problemă trebuie să intrăm în fișierul problematic folosind orice editor text/IDE pentru a alege schimbările corecte.
 +
 +<code bash>
 +student@student:​~$ vim InlineEngine.java
 +class InlineEngine extends Engine {
 +   ​private Boolean isInverted;
 +
 +   ​public InlineEngine(int pistons, String shape, Boolean isInverted) {
 +      super(pistons,​ shape);
 +      this.isInverted = isInverted;
 +   }
 +
 +   ​public Boolean getIsInverted() {
 +      return isInverted;
 +   }
 +
 +   // METODA ADAUGATA IN AMBELE BRANCH-URI CU MICI DIFERENTE
 +<<<<<<<​ HEAD
 +   ​public void methodFromDST() {
 +      System.out.println("​BarFoo"​);​
 +=======
 +   ​public void methodFromSRC() {
 +      System.out.println("​FooBar"​);​
 +>>>>>>>​ test_src
 +   }
 +}
 +</​code>​
 +
 +Pentru a marca diferitele schimbări de pe ambele branch-uri "​Git"​ a introdus niște delimitatori. De asemenea, acolo unde începe secțiunea "​HEAD"​ avem textul care **era** deja prezent pe branch-ul curent (în acest caz "​methodFromDST()"​). Pentru a selecta segmentul corect, tot ce trebuie să facem este să ștergem delimitatorii și bucățile de cod care nu ne interesează.
 +
 +<code bash>
 +class InlineEngine extends Engine {
 +   ​private Boolean isInverted;
 +
 +   ​public InlineEngine(int pistons, String shape, Boolean isInverted) {
 +      super(pistons,​ shape);
 +      this.isInverted = isInverted;
 +   }
 +
 +   ​public Boolean getIsInverted() {
 +      return isInverted;
 +   }
 +
 +   // METODA ADAUGATA IN AMBELE BRANCH-URI CU MICI DIFERENTE
 +   ​public void methodFromSRC() {
 +      System.out.println("​FooBar"​);​
 +   }
 +}
 +:wq
 +
 +student@student:​~$ git add InlineEngine.java
 +student@student:​~$ git commit -m "​merged InlineEngine file"
 +[test_dst ab22900] merged InlineEngine file
 +
 +student@student:​~$ git push
 +Enumerating objects: 1, done.
 +Counting objects: 100% (1/1), done.
 +Writing objects: 100% (1/1), 214 bytes | 214.00 KiB/s, done.
 +Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
 +To https://​github.com/​luis6156/​Test-Git.git
 +   ​008128f..ab22900 ​ test_dst -> test_dst
 +</​code>​
 +
 +Acum avem modificările corecte în urma merge-ului atât pe local, cât și pe remote.
  
 ===== Referințe ===== ===== Referințe =====
   * [[https://​git-scm.com/​doc|Git Documentation]]   * [[https://​git-scm.com/​doc|Git Documentation]]
  
poo-ca-cd/resurse-utile/tutorial-git.1668502072.txt.gz · Last modified: 2022/11/15 10:47 by florian_luis.micu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0