# 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 შესწავლა დროს სჭირდება, მაგრამ ეს უნიკალური უნარებია, რომლებიც ყველა დეველოპერს სჭირდება. დაიწყეთ ძირითადი ბრძანებებით და ნელ-ნელა ითავსებთ უფრო რთულ ფუნქციონალს. პრაქტიკა - საუკეთესო მასწავლებელია! შექმენით პატარა პროექტი და სცადეთ ყველა ეს ბრძანება.