# Git & GitHub გზამკვლევი ჯუნიორებისთვის
## რა არის Git და GitHub?
**Git** არის ვერსიების კონტროლის სისტემა - ეს არის ინსტრუმენტი, რომელიც გეხმარება კოდის ისტორიას დამახსოვრებაში და თანამშრომლებთან ერთად მუშაობაში.
**GitHub** არის ღრუბლოვანი სერვისი, სადაც შეგიძლიათ Git რეპოზიტორიების შენახვა და მართვა.
### ცხოვრებისეული მაგალითი:
წარმოიდგინეთ, რომ წერთ წიგნს რამდენიმე ავტორთან ერთად:
- Git არის როგორც "ავტომატური არქივი" - ყოველი ცვლილება ინახება ისტორიაში
- GitHub არის როგორც "ღრუბლოვანი საცავი" - სადაც ყველამ შეუძლია წიგნზე წვდომა
---
## ძირითადი Git ბრძანებები
### 1. `git init`
**რას აკეთებს:** ახალ Git რეპოზიტორს ქმნის მიმდინარე ფოლდერში
**რისთვის საჭირო:** ახალი პროექტის დაწყებისას
**გამოყენება:**
```bash
git init
```
**მაგალითი:**
```bash
mkdir my-project
cd my-project
git init
```
### 2. `git clone`
**რას აკეთებს:** არსებულ რეპოზიტორს კოპირებს თქვენს კომპიუტერზე
**რისთვის საჭირო:** GitHub-დან ან სხვა რეპოზიტორიდან პროექტის გადმოწერისთვის
**გამოყენება:**
```bash
git clone <repository-url>
```
**მაგალითი:**
```bash
git clone https://github.com/username/my-project.git
```
### 3. `git add`
**რას აკეთებს:** ფაილებს ამატებს "staging area"-ში (მომზადების ზონაში)
**რისთვის საჭირო:** რომ Git-მა იცოდეს, რომელი ცვლილებები უნდა შეინახოს
**გამოყენება:**
```bash
git add <filename> # კონკრეტული ფაილი
git add . # ყველა ფაილი
git add *.js # ყველა .js ფაილი
```
**ცხოვრებისეული მაგალითი:**
როგორც რესტორანში, სადაც "staging area" არის უეფროს მაგიდა - აქ ადევთ კერძებს სანამ სამზარეულოში გაგზავნით.
### 4. `git commit`
**რას აკეთებს:** ყველა staging area-ში არსებულ ცვლილებას ინახავს ისტორიაში
**რისთვის საჭირო:** "snapshot" ავყოფთ პროექტის მდგომარეობისა
**გამოყენება:**
```bash
git commit -m "შეტყობინება იმაზე, რა შეიცვალა"
```
**კარგი commit შეტყობინებების მაგალითები:**
```bash
git commit -m "Add user login functionality"
git commit -m "Fix bug in payment processing"
git commit -m "Update README with installation instructions"
```
### 5. `git status`
**რას აკეთებს:** აჩვენებს რეპოზიტორის მიმდინარე მდგომარეობას
**რისთვის საჭირო:** რომ ვნახოთ, რა ცვლილებები გვაქვს
**გამოყენება:**
```bash
git status
```
### 6. `git log`
**რას აკეთებს:** აჩვენებს commit-ების ისტორიას
**რისთვის საჭირო:** რომ ვნახოთ, რა ცვლილებები იყო და ვინ გააკეთა
**გამოყენება:**
```bash
git log # სრული ისტორია
git log --oneline # შემოკლებული ვერსია
git log --graph # ვიზუალური ჩვენება
```
### 7. `git diff`
**რას აკეთებს:** აჩვენებს ცვლილებებს ფაილებში
**რისთვის საჭირო:** რომ ვნახოთ, რა შეიცვალა
**გამოყენება:**
```bash
git diff # ყველა ცვლილება
git diff <filename> # კონკრეტული ფაილის ცვლილება
```
### 8. `git branch`
**რას აკეთებს:** ახალ branch-ს ქმნის ან არსებულებს აჩვენებს
**რისთვის საჭირო:** პარალელურად მუშაობისთვის სხვადასხვა ფუნქციონალზე
**გამოყენება:**
```bash
git branch # ყველა branch-ის ნახვა
git branch <branch-name> # ახალი branch-ის შექმნა
git branch -d <branch-name> # branch-ის წაშლა
```
**ცხოვრებისეული მაგალითი:**
Branch-ები არის როგორც პარალელური სამყაროები - შეგიძლიათ ერთ სამყაროში ტესტირება გაუკეთოთ ახალ ფუნქციას, მეორეში კი ძირითადი მუშაობა გააგრძელოთ.
### 9. `git checkout / git switch`
**რას აკეთებს:** branch-ს ცვლის ან ახალს ქმნის
**რისთვის საჭირო:** branch-ებს შორის გადასართავად
**გამოყენება:**
```bash
git checkout <branch-name> # branch-ზე გადასვლა
git checkout -b <branch-name> # ახალი branch-ის შექმნა და მასზე გადასვლა
git switch <branch-name> # თანამედროვე მეთოდი
```
### 10. `git merge`
**რას აკეთებს:** ერთ branch-ს ცვლილებებს ერწყმის მეორეს
**რისთვის საჭირო:** როდესაც ახალი ფუნქციონალი მზადაა main კოდში ჩასართავად
**გამოყენება:**
```bash
git merge <branch-name>
```
### 11. `git pull`
**რას აკეთებს:** remote რეპოზიტორიდან ყველა ცვლილებას ჩამოწერს
**რისთვის საჭირო:** რომ მივიღოთ უახლესი ცვლილებები თანამშრომლებისგან
**გამოყენება:**
```bash
git pull origin main
```
### 12. `git push`
**რას აკეთებს:** ლოკალურ ცვლილებებს აგზავნის remote რეპოზიტორში
**რისთვის საჭირო:** რომ სხვებმა ნახონ ჩვენი ცვლილებები
**გამოყენება:**
```bash
git push origin <branch-name>
```
### 13. `git remote`
**რას აკეთებს:** remote რეპოზიტორიების მართვა
**რისთვის საჭირო:** GitHub-თან კავშირისთვის
**გამოყენება:**
```bash
git remote add origin <repository-url>
git remote -v # remote-ების ნახვა
```
---
## საუკეთესო პრაქტიკები
### Commit შეტყობინებები
- **კარგი:** `Add user authentication`
- **ცუდი:** `fixed stuff`
### Branch-ების სახელები
- **კარგი:** `feature/user-login`, `bugfix/payment-error`
- **ცუდი:** `test`, `my-branch`
### Commit-ების ზომა
- პატარა, ლოგიკური ცვლილებები
- არა დიდი, რთული ცვლილებები
### pull მუდმივად
```bash
git pull origin main # ყოველდღე მუშაობის დაწყებამდე
```
---
## პრაქტიკული მაგალითი: გუნდური მუშაობა
წარმოვიდგინოთ, რომ 3 დეველოპერი მუშაობს ონლაინ მაღაზიის პროექტზე:
### პროექტის დაწყება
**ლიდერი (Ana) ქმნის პროექტს:**
```bash
mkdir online-store
cd online-store
git init
touch README.md
git add README.md
git commit -m "Initial commit"
git remote add origin https://github.com/ana/online-store.git
git push -u origin main
```
### გუნდის წევრები პროექტს იღებენ
**Giorgi და Nino კლონავენ პროექტს:**
```bash
git clone https://github.com/ana/online-store.git
cd online-store
```
### ფუნქციონალზე მუშაობა
**Giorgi მუშაობს user authentication-ზე:**
```bash
git checkout -b feature/user-auth
# მუშაობს ფაილებზე...
git add .
git commit -m "Add user registration form"
git push origin feature/user-auth
```
**Nino მუშაობს shopping cart-ზე:**
```bash
git checkout -b feature/shopping-cart
# მუშაობს ფაილებზე...
git add .
git commit -m "Add shopping cart functionality"
git push origin feature/shopping-cart
```
### Pull Request-ების შექმნა
GitHub-ზე Giorgi და Nino ქმნიან Pull Request-ებს:
1. მიდიან GitHub-ზე
2. ჩვეულებრივ "New Pull Request" ღილაკზე
3. ირჩევენ თავიანთ branch-ს
4. წერენ აღწერას
5. Ana-ს სთხოვენ review-ს
### კოდის გადახედვა და გაერთიანება
**Ana აკეთებს code review:**
```bash
git checkout feature/user-auth
git pull origin feature/user-auth
# ამოწმებს კოდს, ტესტავს...
```
**თუ ყველაფერი ოკეა, Ana merge აკეთებს:**
```bash
git checkout main
git merge feature/user-auth
git push origin main
```
### სინქრონიზაცია
**ყველა დეველოპერი იღებს უახლეს ცვლილებებს:**
```bash
git checkout main
git pull origin main
```
### კონფლიქტების გადაწყვეტა
**თუ ორი ადამიანი ერთსა და იმავე ფაილს ცვლის:**
```bash
git pull origin main
# Auto-merging failed due to conflicts
git status # ნახავს კონფლიქტებს
# ხელით გადაწყვეტს კონფლიქტებს
git add .
git commit -m "Resolve merge conflicts"
```
---
## ყოველდღიური Workflow
### 1. დილაობით
```bash
git checkout main
git pull origin main
```
### 2. ახალი ფუნქციონალის დაწყება
```bash
git checkout -b feature/new-feature
```
### 3. მუშაობის პროცესში
```bash
# ცვლილებების გაკეთება
git add .
git commit -m "Add specific functionality"
```
### 4. მუშაობის დასრულების შემდეგ
```bash
git push origin feature/new-feature
# შემდეგ GitHub-ზე Pull Request
```
### 5. მერგის შემდეგ
```bash
git checkout main
git pull origin main
git branch -d feature/new-feature
```
---
## ხშირი შეცდომები და მათი თავიდან აცილება
### 1. დიდი commit-ები
❌ **ცუდი:**
```bash
git add .
git commit -m "Fixed everything"
```
✅ **კარგი:**
```bash
git add login.js
git commit -m "Fix login validation"
git add cart.js
git commit -m "Add remove item functionality"
```
### 2. main branch-ზე პირდაპირ მუშაობა
❌ **ცუდი:**
```bash
git checkout main
# პირდაპირ main-ზე კოდის წერა
```
✅ **კარგი:**
```bash
git checkout -b feature/my-feature
# ცალკე branch-ზე მუშაობა
```
### 3. pull-ის დავიწყება
❌ **ცუდი:**
```bash
# დღეები გავლის main-ზე pull-ის გარეშე
```
✅ **კარგი:**
```bash
git pull origin main # ყოველდღე
```
---
## დახმარების რესურსები
### სასწავლო რესურსები:
- [Git Documentation](https://git-scm.com/doc)
- [GitHub Learning Lab](https://lab.github.com/)
- [Interactive Git Tutorial](https://learngitbranching.js.org/)
### დამატებითი კომანდები:
```bash
git help <command> # კომანდის დახმარება
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
git stash # დროებითი შენახვა
git stash pop # stash-ის დაბრუნება
```
---
## ჯამი
Git და GitHub შესწავლა დროს სჭირდება, მაგრამ ეს უნიკალური უნარებია, რომლებიც ყველა დეველოპერს სჭირდება. დაიწყეთ ძირითადი ბრძანებებით და ნელ-ნელა ითავსებთ უფრო რთულ ფუნქციონალს.
პრაქტიკა - საუკეთესო მასწავლებელია! შექმენით პატარა პროექტი და სცადეთ ყველა ეს ბრძანება.