ბიბლიოთეკა
00/07 · ~32 წთ
GUIDEDECK · როგორ აღრიცხავენ, იზიარებენ და აღადგენენ ცვლილებებს

Git &
ვერსიების კონტროლი
მოდელიდან დაწყებული.

32-წუთიანი სამუშაო სესია იმაზე, თუ რას აკეთებს Git სინამდვილეში კულისებში — სნეპშოტების მოდელი და კომიტების გრაფი, სამი არე, ბრენჩინგი და მერჯი, რებეისის კომპრომისები, თანამშრომლობა remote-ებთან და pull request-ებით, თქვენს გუნდზე მორგებული სამუშაო პროცესი და როგორ გააუქმოთ თითქმის ყველაფერი უსაფრთხოდ.

~32 წთდამწყები → საშუალოინსტრუმენტისგან დამოუკიდებელი
გადაახვიეთ
01 · როგორ ხედავს Git ისტორიას 4 წთ

კომიტი არის სნეპშოტი,
ისტორია კი მათი გრაფი.

Git-თან დაკავშირებული დაბნეულობის უმეტესობა არასწორი წარმოდგენიდან მოდის. Git არ ინახავს ფაილების ცვლილებების ან დიფების სიას. ის ინახავს თქვენი პროექტის სრული სნეპშოტების სერიას, სადაც თითოეული უკან, იმ სნეპშოტზე მიუთითებს, საიდანაც წარმოიშვა. სწორად წარმოიდგინეთ ეს ერთი სურათი და თითქმის ყველა ბრძანება აღარ მოგეჩვენებათ ჯადოქრობად.

ვერსიების კონტროლი — სისტემა, რომელიც აღრიცხავს პროექტის ისტორიას, რომ დაინახოთ რა შეიცვალა, როდის და ვის მიერ, და ნებისმიერი წერტილიდან დაბრუნდეთ ან ახალი ბრენჩი გამოყოთ. Git არის განაწილებული ვერსიების კონტროლის სისტემა: ყოველი კლონი მთელი ისტორიის სრული ასლია, ამიტომ კომიტს, ბრენჩს და ლოგის დათვალიერებას სერვერისა და ქსელის გარეშე ახერხებთ.

სნეპშოტები, არა დიფები

  • ყოველი კომიტი იღებს ფაილების მთელ ხეს იმ მომენტისთვის, პლუს მაჩვენებელს თავის მშობელ კომიტზე.
  • ყოველ კომიტს სახელად აქვს მისი შიგთავსის ჰეში (40-სიმბოლოიანი SHA). იგივე შიგთავსი — იგივე ჰეში; სწორედ ასე ახდენს Git უცვლელი ფაილების დედუპლიკაციას მათი კოპირების ნაცვლად.
  • გაჰყევით მშობლის მაჩვენებლებს უკან და მთელ ისტორიას წაიკითხავთ. მაჩვენებლების ეს ჯაჭვი არის რეპოზიტორია.

C3 (HEAD) მიუთითებს თავის მშობელ C2-ზე, რომელიც C1-ზე მიუთითებს. ყოველი კომიტი ასევე ინახავს პროექტის ხის სრულ სნეპშოტს.

# what a commit object actually contains tree 9c1f… # the full snapshot (files + folders) parent d4e5… # the commit this one builds on author Dani <dani@team.dev> 1719600000 committer Dani <dani@team.dev> 1719600000 Add checkout total to cart # the message

კომიტი → ხე → ბლობები. უცვლელი ფაილები იმავე ბლობს იყენებენ, ამიტომ სნეპშოტი იაფია.

HEAD

სად ხართ ახლა

მაჩვენებელი კომიტზე (ჩვეულებრივ ბრენჩის გავლით), რომელზეც თქვენი შემდეგი კომიტი დაშენდება. „Detached HEAD“ უბრალოდ ნიშნავს, რომ ის პირდაპირ კომიტზე მიუთითებს და არა ბრენჩზე.

ref / ბრენჩი

სახელი კომიტისთვის

ბრენჩი, მაგალითად main, უბრალოდ მოძრავი იარლიყია, რომელიც ერთ კომიტზე მიუთითებს. კომიტის გაკეთება ამ იარლიყს წინ წასწევს — მთელი მექანიზმი ეს არის.

DAG

ისტორიის ფორმა

ისტორია არის მიმართული აციკლური გრაფი — კომიტები მშობლის წიბოებით, ციკლების გარეშე. მერჯი კომიტს ორ მშობელს აძლევს; მხოლოდ ასე იტოტება და ისევ ერთდება გრაფი.

02 · სამი არე 4 წთ

სამუშაო ხე → სტეიჯინგი → რეპოზიტორია.

კომიტი თქვენს ფაილებს პირდაპირ არ იღებს სნეპშოტად. შუაში განზრახ დგას ერთი ნაბიჯი — სტეიჯინგის არე — რომელიც საშუალებას გაძლევთ ზუსტად აირჩიოთ, რა მოხვდება შემდეგ კომიტში. ამ სამი ადგილის გაგება არის განსხვავება იმას შორის, Git-ს ებრძვით თუ მართავთ.

სტეიჯინგის არე (ასევე ინდექსი) — თქვენი შემდეგი კომიტის მონახაზი, რომელსაც ნაწილ-ნაწილ აწყობთ. git add ფაილის მიმდინარე შიგთავსს სტეიჯინგში აკოპირებს; git commit კი ყველაფერს, რაც სტეიჯინგშია, ახალ სნეპშოტად ბეჭდავს. ფაილები, რომლებიც შეასწორეთ, მაგრამ სტეიჯინგში არ გადაიტანეთ, უბრალოდ გარეთ რჩება.

add ამზადებს მონახაზს; commit ბეჭდავს მას; restore კი სუფთა ასლს უკან აბრუნებს.

რატომ ამართლებს შუალედური ნაბიჯი

  • სამი ფაილი შეცვალეთ, მაგრამ ამ შესწორებას მხოლოდ ორი ეხება — ეს ორი გადაიტანეთ სტეიჯინგში და დააკომიტეთ სუფთა, გადასახედად მოსახერხებელი ერთეული.
  • git add -p ფაილის ნაწილებს (ჰანკებს) გადაიტანს სტეიჯინგში, ასე რომ ერთი არეული სამუშაო სესია რამდენიმე მიზანმიმართულ კომიტად იქცევა.
  • git status ყოველთვის აჩვენებს დაყოფას: სტეიჯინგში, შეცვლილი მაგრამ სტეიჯინგის გარეშე, და აღურიცხავი. წაიკითხეთ ის ყოველი კომიტის წინ.
# see the three buckets at a glance git status -s # M cart.ts (modified, unstaged) # ?? notes.txt (untracked) # stage only what belongs together git add cart.ts total.ts git commit -m "Fix rounding in cart total"
სტეიჯი
total.ts · cart.ts
შეცვლილი
readme.md
უცნობი
notes.txt

კომიტში მხოლოდ სტეიჯინგში გადატანილი ჯგუფი ხვდება. დანარჩენი უცვლელად რჩება თქვენს სამუშაო ხეში.

03 · ბრენჩები და მერჯი 5 წთ

ბრენჩი არის მოძრავი იარლიყი — მერჯი კი ორ მათგანს აერთებს.

რადგან ბრენჩი უბრალოდ კომიტზე მაჩვენებელია, მისი შექმნა მყისიერია და არაფერი ღირს. მუშაობთ ბრენჩზე, შემდეგ მერჯავთ უკან, რომ მისი კომიტები ისტორიის სხვა ხაზში გადაიტანოთ. ეს შეერთება ორნაირად შეიძლება მოხდეს.

ბრენჩი — მსუბუქი, მოძრავი მაჩვენებელი კომიტზე. git switch -c feature ქმნის ახალ იარლიყს თქვენს მიმდინარე კომიტზე და HEAD-ს მასზე გადაიტანს. ახალი კომიტები ამ იარლიყს წინ სწევს, ხოლო main ადგილზე რჩება.
fast-forward — მერჯის გარეშე

თუ main არ დაძრულა, Git უბრალოდ მის იარლიყს ბრენჩის წვერომდე წასწევს. ისტორია წრფივი რჩება.

სამმხრივი — რეალური მერჯ-კომიტი

როცა ორივე ბრენჩს ახალი კომიტები აქვს, Git ქმნის მერჯ-კომიტს M ორი მშობლით, რომ ისინი ერთმანეთს დაუკავშიროს.

git switch -c add-search # new branch at HEAD # …commit some work… git switch main git merge add-search # fast-forward or 3-way # a conflict pauses the merge: # <<<<<<< HEAD … ======= … >>>>>>> add-search git add resolved.ts && git commit # finish it
<<<<<<< HEAD price = base * 1.2 ======= price = base * tax >>>>>>> add-search

კონფლიქტი შეცდომა არ არის — ეს Git-ის თხოვნაა, აირჩიოთ ერთი და იმავე ხაზების ორ ცვლილებას შორის. შეასწორეთ, გადაიტანეთ სტეიჯინგში, დააკომიტეთ.

კონფლიქტი მხოლოდ მაშინ ხდება, როცა ორი ბრენჩი ერთი და იმავე ფაილის ერთსა და იმავე ხაზებს ცვლის. მცირე და ხშირი მერჯები მათ იშვიათსა და პატარას ხდის — სწორედ ეს არის მთელი არგუმენტი 06-ე სექციის სამუშაო პროცესების უკან.

04 · მერჯი/რებეისი 5 წთ

ერთი მიზანი, ორი ისტორია:
შეინახეთ ის თუ გაიმეორეთ.

ორივე ერთი ბრენჩის ნამუშევარს მეორეზე გადააქვს. მერჯი აღრიცხავს იმას, რაც სინამდვილეში მოხდა — ორი ხაზი, რომლებიც შეხვდნენ. რებეისი თქვენს კომიტებს ისე გადაწერს, თითქოს უახლესი წვეროდან დაიწყეთ, და სუფთა სწორ ხაზს იძლევა. არცერთი არ არის „სწორი“; ისინი უბრალოდ სხვადასხვა რამეზეა ოპტიმიზებული.

რებეისი — აიღეთ თქვენი კომიტები, გვერდზე გადადეთ, გადაინაცვლეთ ახალ ფუძემდე და შემდეგ სათითაოდ ხელახლა დაადეთ ისინი ზემოდან. შედეგი წრფივად გამოიყურება, მაგრამ ყოველი ხელახლა დადებული კომიტი სრულიად ახალი კომიტია ახალი ჰეშით — ორიგინალები გადაწერილია, და არა გადატანილი.
მერჯი — გულწრფელი, უსაფრთხო

ინახავს ყოველ კომიტს და აღრიცხავს შეერთებას. ისტორია აჩვენებს, რომ ბრენჩი ნამდვილად არსებობდა — უფრო დატვირთული გრაფის ფასად.

რებეისი — წრფივი, გადაწერა

A' და B' თქვენი კომიტების ასლებია ახალი ჰეშებით. გრაფი სუფთაა; ორიგინალები კი აღარ არსებობს.

ნუ — საერთო ისტორიის რებეისი
# main is already pushed and others have it git switch main git rebase feature # rewrites public commits! git push --force # everyone else's history # now diverges — painful for the whole team
ასე — რებეისი საკუთარ ბრენჩზე
# tidy your unshared feature before review git switch feature git rebase main # replay onto latest main # resolve any conflicts once, linearly git push --force-with-lease # safe on your own branch
რებეისის ოქროს წესი — არასოდეს გააკეთოთ რებეისი იმ კომიტებზე, რომლებიც სხვებს უკვე აქვთ. საერთო ისტორიის გადაწერა ყველა დანარჩენს მტკივნეულ შეჯერებაში ითრევს. თავისუფლად გააკეთეთ რებეისი საკუთარ ჯერ არაგაგზავნილ ბრენჩზე; როცა ისტორია საერთოა — გამოიყენეთ მერჯი.

აირჩიეთ იმის მიხედვით, რას აფასებთ

  • გინდათ ზუსტი ჩანაწერი და ნულოვანი რისკი? მერჯი. ეს უსაფრთხო ნაგულისხმევი არჩევანია და არასოდეს გადაწერს არაფერს.
  • გინდათ სუფთა, წრფივი ლოგი, რომელიც ადვილად იკითხება და იბისექტება? რებეისით გადაიტანეთ ფიჩერ-ბრენჩი main-ზე მერჯამდე.
  • ბევრი გუნდი ორივეს აერთიანებს: ლოკალურად რებეისი მოსაწესრიგებლად, შემდეგ კი მერჯი pull request-ის გავლით (ხშირად squash მერჯით) main-ში.

squash მერჯი ბრენჩის ყველა კომიტს ერთ ახალ კომიტად კუმშავს სამიზნე ბრენჩზე. main-ში თითო ფიჩერზე ერთი მოწესრიგებული ჩანაწერი გრჩებათ, ხოლო ბრენჩის ხმაურიანი შუალედური კომიტები საერთო ისტორიაში საერთოდ არ ხვდება. GitHub-სა და GitLab-ზე სწორედ ამიტომ არის პოპულარული — უბრალოდ გაითვალისწინეთ, რომ ბრენჩის კომიტ-დონის დეტალიზაციას კარგავთ.

05 · remote, pull request და თანამშრომლობა 5 წთ

remote უბრალოდ
რეპოზიტორიის კიდევ ერთი ასლია.

Git განაწილებულია, ამიტომ სერვერი განსაკუთრებული არაფერია — ის კიდევ ერთი კლონია, რომელზეც ყველა შეთანხმდა. fetch-ით ჩამოტვირთავთ მის კომიტებს, push-ით ატვირთავთ თქვენსას, ხოლო pull request ის ადგილია, სადაც ადამიანები კოდს ამოწმებენ, სანამ ის საერთო ხაზს შეუერთდება.

remote — დასახელებული სანიშნე რეპოზიტორიის სხვა ასლისთვის, რომელსაც პირობითად origin ჰქვია. თქვენი ლოკალური origin/main read-only სნეპშოტია იმისა, სად იყო სერვერის main ბოლო კავშირის დროს — და არა ცოცხალი ხედი.

fetch ჩამოტვირთავს თქვენს სამუშაოს შეუხებლად; pull = fetch + merge; push ატვირთავს თქვენს კომიტებს.

ჯერ fetch, მერე გადაწყვეტილება

  • fetch განაახლებს თქვენს origin/* მაჩვენებლებს, მაგრამ არასოდეს ცვლის თქვენს ბრენჩებს ან ფაილებს — მისი გაშვება ყოველთვის უსაფრთხოა.
  • pull არის fetch და შემდეგ merge (ან rebase, თუ --rebase მიუთითეთ). ის ნამდვილად ცვლის თქვენს ბრენჩს, ამიტომ კონფლიქტი შესაძლებელია.
  • თრექინგ-ბრენჩი აკავშირებს თქვენს ლოკალურ main-ს origin/main-თან, რომ Git-მა შეძლოს თქვას „წინ 2, უკან 1“.
git fetch origin git switch -c fix-typo # …მუშაობა, add, commit… git push -u origin fix-typo # აქედან გახსენით PR
pull request (GitLab-ში მას merge request ჰქვია) — წინადადება ერთი ბრენჩის მეორეში მერჯზე, შემოხვეული განხილვაში, დისკუსიასა და ავტომატურ შემოწმებებში. ეს ჰოსტინგ-პლატფორმის ფუნქციონალია და არა Git-ის ბრძანება — კარიბჭე, სადაც კოდის განხილვა და CI/CD პაიპლაინები მუშაობს, სანამ რამე main-ს მიაღწევს.

ჰოსტინგის ლანდშაფტი

Git-ის ძრავა ყველგან ერთნაირია; თქვენ ირჩევთ მის გარშემო არსებულ თანამშრომლობის პლატფორმას. თითო ხაზი — დადებითი, უარყოფითი და როდის იმარჯვებს.

GitHub — ნაგულისხმევი ქსელური ეფექტი

დადებითი
ყველაზე დიდი საზოგადოება და ინტეგრაციების ეკოსისტემა; Actions CI და pull request-ის განხილვა შესანიშნავია და თითქმის ყველა დეველოპერისთვის ნაცნობი.
უარყოფითი
მოწინავე მმართველობა და თვითჰოსტინგი Enterprise დონეების მიღმაა; პლატფორმა დახურულია.

აირჩიეთ, როცა  გინდათ მაქსიმალური მოცვა, ღია კოდის ხილვადობა ან უმცირესი წინააღმდეგობის გზა ახალი გუნდისთვის.

GitLab — ერთი ინტეგრირებული DevOps პლატფორმა

დადებითი
კოდი, CI/CD, ისიუები, რეესტრი და უსაფრთხოების სკანირება ერთ პროდუქტში; ძლიერი თვითმართვადი ვარიანტი, რომელსაც სრულად აკონტროლებთ.
უარყოფითი
სიგანე ნიშნავს მეტ შესასწავლ და სამართავ ზედაპირს; თვითჰოსტინგს რეალური მოვლის ღირებულება აქვს.

აირჩიეთ, როცა  გინდათ ერთი მომწოდებელი თავიდან ბოლომდე, ან მთელი სტეკის საკუთარ ინფრასტრუქტურაში გაშვება გჭირდებათ.

Bitbucket — თავის სახლში Atlassian-ის სტეკში

დადებითი
ღრმა, მშობლიური Jira ინტეგრაცია და Atlassian SSO; კომფორტულია, თუ თქვენი ორგანიზაცია უკვე Jira-სა და Confluence-ში ცხოვრობს.
უარყოფითი
GitHub-სა და GitLab-ზე მცირე საზოგადოება და მესამე მხარის ეკოსისტემა; ახალი ინსტრუმენტებისთვის ნაკლები იმპულსი.

აირჩიეთ, როცა  თქვენი გუნდი უკვე Atlassian-ზეა სტანდარტიზებული და გინდათ მჭიდრო კავშირი ისიუსა და კოდს შორის.

06 · ბრენჩების ვორქფლოუ 5 წთ

ვორქფლოუ არის გუნდის შეთანხმება და არა Git-ის ფუნქციონალი.

Git არანაირ პროცესს არ გახვევთ. ბრენჩების ვორქფლოუ არის შეთანხმება, რომელსაც თქვენი გუნდი აწესებს: როგორ იწოდება ბრენჩები, რამდენ ხანს ცოცხლობს და როგორ აღწევს სამუშაო პროდაქშენამდე. გულწრფელი სიმართლე: უმეტეს გუნდში მარტივი ვორქფლოუ იმარჯვებს — სირთულე რეალურმა შეზღუდვამ უნდა დაიმსახუროს.

ბრენჩების ვორქფლოუ — საერთო წესების ნაკრები ბრენჩების შექმნის, დასახელების, განხილვისა და მერჯისთვის, რომ ყველა პროგნოზირებადად ინტეგრირდეს. მთავარი ცვლადი არის ბრენჩის სიცოცხლის ხანგრძლივობა: საათები და დღეები კონფლიქტებს პატარად ტოვებს; კვირები კი მტკივნეულ „მერჯის ჯოჯოხეთს“ იწვევს. ეს პირდაპირ უკავშირდება იმას, როგორ გეგმავს თქვენი გუნდი სამუშაოს — Agile & Delivery.

Trunk-based — ყველა ერთ ხაზზე, მოკლე ბრენჩებით

დადებითი
მცირე, თითქმის მუდმივი ინტეგრაცია კონფლიქტებს ტრივიალურად ტოვებს; ბუნებრივად ეხამება უწყვეტ მიწოდებას.
უარყოფითი
მოითხოვს ძლიერ ავტომატურ ტესტებს და ფიჩერ-ფლაგებს, რომ დაუსრულებელი ფუნქციონალი მომხმარებელს არ მოხვდეს.

ერგება  გუნდებს, რომლებიც უწყვეტად უშვებენ და მყარი CI აქვთ — თანამედროვე ნაგულისხმევი არჩევანი პროდუქტის ინჟინერიაში.

GitHub Flow — ბრენჩი, PR, მერჯი, დეპლოი

დადებითი
მარტივზე მარტივი: ერთი ხანგრძლივი ბრენჩი (main), მოკლე ფიჩერ-ბრენჩები, განხილვა PR-ით, დეპლოი მერჯზე.
უარყოფითი
გულისხმობს, რომ main-იდან ხშირად დეპლოიავთ; პარალელურად გამოშვებული ვერსიებისთვის ჩაშენებული ადგილი არ აქვს.

ერგება  ვებ-აპლიკაციებისა და სერვისების უმეტესობას უწყვეტი დეპლოიმენტით — დაიწყეთ აქედან, თუ საწინააღმდეგო მიზეზი არ გაქვთ.

GitFlow — ბევრი ხანგრძლივი ბრენჩი

დადებითი
მკაფიო ადგილები develop-ის, release-ისა და hotfix-ისთვის — სასარგებლოა, როცა ერთდროულად რამდენიმე გამოშვებულ ვერსიას უვლით.
უარყოფითი
ხანგრძლივი ბრენჩები დიდ მერჯებსა და ზედნადებს აჩენს; უწყვეტი ვებ-მიწოდებისთვის ზედმეტია და ხშირად მავნეც.

ერგება  ვერსიებიან/დესკტოპ/on-prem პროგრამებს დაგეგმილი რელიზებით — იშვიათად სწორი არჩევანი SaaS-ისთვის, რომელიც ყოველდღე უშვებს.

ნამდვილი ცვლადი ბრენჩის სიცოცხლის ხანგრძლივობაა

  • ხანმოკლე ბრენჩები (საათები/დღეები) → პატარა მერჯები, იშვიათი კონფლიქტები, სწრაფი უკუკავშირი.
  • ხანგრძლივი ბრენჩები (კვირები) → განშტოება გროვდება და გადაიზრდება „მერჯის ჯოჯოხეთში“ და სარისკო ერთბაშად ინტეგრაციებში.
  • ყოველი თანამედროვე ვორქფლოუ, არსებითად, ბიძგია მცირედ და ხშირად ინტეგრირებისკენ.
  • ახალი ვებ-აპლიკაცია / სერვისი → GitHub Flow. უმარტივესი, რაც მუშაობს.
  • მომწიფებული გუნდი ძლიერი CI-თა და ფიჩერ-ფლაგებით → Trunk-based. ყველაზე სწრაფი ინტეგრაცია.
  • ვერსიებიან პროგრამას უშვებთ და რამდენიმე რელიზს უვლით → GitFlow, და მხოლოდ მაშინ.
  • ვერ გადაწყვიტეთ? აირჩიეთ უფრო მარტივი. ცერემონიის დამატება ყოველთვის შეგიძლიათ, როცა ამას რეალური შეზღუდვა მოითხოვს — YAGNI.
07 · აღდგენა — reflog, reset, revert, bisect 4 წთ

Git-ში თითქმის არაფერი
იკარგება საბოლოოდ.

თქვენ მიერ გაკეთებული კომიტები მაშინაც რჩება, როცა მათ „დაკარგავთ“ — reflog ახსოვს, სად იყო HEAD. აღდგენის ოთხი ინსტრუმენტის ცოდნა შემზარავი მომენტების უმეტესობას ორბრძანებიან შესწორებად აქცევს.

reflog — ლოკალური ჟურნალი ყველა პოზიციისა, სადაც HEAD მიუთითებდა, ინახება დაახლოებით 90 დღე. რებეისი ან hard reset გაგიფუჭდათ? git reflog გაჩვენებთ კომიტს, რომელზეც წუთის წინ იყავით, ხოლო git reset --hard HEAD@{1} უკან დაგაბრუნებთ.
reset — ბრენჩს ამოძრავებს

გადაწერს ლოკალურ ისტორიას — შესანიშნავია გაგზავნამდე, საშიში მის შემდეგ. --soft ცვლილებებს სტეიჯინგში ტოვებს, --hard კი შლის.

revert — გამაუქმებელი კომიტი

ქმნის ახალ კომიტს, რომელიც ძველს აუქმებს. საერთო ბრენჩებზე უსაფრთხოა, რადგან ისტორიას არასოდეს გადაწერს.

# local, not yet pushed → reset is fine git reset --soft HEAD~1 # undo commit, keep changes staged # already pushed / shared → revert git revert a1b2c3 # new commit that undoes it # recover from a lost rebase/reset git reflog # find the old HEAD… git reset --hard HEAD@{2}

git bisect ორობითი ძებნით ეძებს ცნობილ კარგ და ცნობილ ცუდ კომიტს შორის იმას, რომელმაც ყველაფერი გააფუჭა — log(n) ტესტი და არა n.

ხუთი რამ, რაც უნდა წაიღოთ

1კომიტები გრაფში სნეპშოტებია. თითოეული მიუთითებს მშობელზე და სრულ ხეზე — სწორედ ეს ერთი მოდელი ხსნის ყველაფერ დანარჩენს.
2გააზრებულად გადაიტანეთ სტეიჯინგში. ინდექსი გაძლევთ საშუალებას შექმნათ პატარა, მიზანმიმართული კომიტები იმის ნაცვლად, რომ ყველაფერი ერთბაშად ჩააგდოთ.
3მერჯი ინახავს, რებეისი გადაწერს. არასოდეს გააკეთოთ რებეისი იმ ისტორიაზე, რომელიც სხვებს უკვე აქვთ — ეს არის ოქროს წესი.
4ინტეგრირდით მცირედ და ხშირად. ხანმოკლე ბრენჩები ყოველი ჯანსაღი ვორქფლოუს ჩუმი საიდუმლოა.
5reset პირადისთვის, revert საერთოსთვის. reflog კი ნიშნავს, რომ თითქმის ყოველთვის შეგიძლიათ დაბრუნება.
ცოდნის შემოწმება

დაგამახსოვრდათ?

ხუთი სწრაფი კითხვა კომიტების მოდელზე, სტეიჯინგზე, მერჯსა და რებეისზე, remote-ებსა და აღდგენაზე — მყისიერი უკუკავშირი, ავტორიზაციის გარეშე.

შეაფასეთ ეს დასტა
იყავით პირველი

ნავიგაცია ← → ღილაკებით ან სქროლით · უკან ბიბლიოთეკაში