قدرت Git: راهنمای کنترل نسخه مشارکتی

وقتی شروع به یادگیری کدنویسی کردم، هیچکس به من نگفت که Git چیست یا چرا مهم است. این یکی از آن کلماتی بود که وانمود میکردم که میفهمم، زیرا همه تصور میکردند که معنی آن را میدانم. اما تا آن مرحله، من از IDE های داخلی استفاده می کردم، و از git استفاده نکرده بودم. برای یکی از پروژه های بوت کمپ من، مجبور بودم تعداد مشخصی از commit ها را پاس کنم. من در مورد تعهدات را فراموش کردم، و فقط حدود سه. من تمام پروژه را انجام دادم تا بتوانم تعداد مورد نیاز commit را اضافه کنم. وقتی روی یک پروژه ساده مانند من کار می کنید، پروژه ای که هیچ کس دیگری آن را بررسی نمی کند یا در آن مشارکت نمی کند، یادآوری متعهد شدن به آن بسیار شهودی است. من فقط می خواستم پروژه ام در سریع ترین زمان ممکن به نتیجه برسد. اکنون می دانم که احتمالاً رویکرد اشتباهی برای یادگیری در پیش گرفته ام. از آنجایی که وارد عرصه فناوری میشوم، من میتوانم به صورت مشترک کار کنم، و این ابزارها میتوانند برای اطمینان از اینکه روابط مشترک خوب کار میکنند، بسیار مفید باشند. امیدواریم این راهنمای مبتدی Git به شما در درک مفید بودن Git و نحوه استفاده از آن به عنوان بخشی از جعبه ابزار خود کمک کند.
گیت چیست؟
Git یک سیستم کنترل نسخه توزیع شده است که به توسعه دهندگان اجازه می دهد کد منبع خود را مدیریت کرده و در پروژه ها همکاری کنند. این به شما امکان می دهد تغییرات ایجاد شده در فایل ها را در طول زمان ردیابی کنید، و یک مخزن متمرکز و یک تاریخچه جامع از تغییرات ایجاد می کند، که امکان تجربه کار گروهی یکپارچه و مدیریت کد سازمان یافته را فراهم می کند.
من دوست دارم به Git به عنوان یک ماشین زمان برای کد شما فکر کنم.
تصور کنید در حال نوشتن یک کتاب هستید. شما با اولین پیش نویس خود شروع می کنید و در ادامه تغییرات ایجاد می کنید. Git به عنوان ماشین زمان قابل اعتماد شما عمل می کند و به شما امکان می دهد در زمان به عقب و جلو سفر کنید و هر نسخه از داستان خود را ثبت کنید.
هر بار که تغییراتی در کتاب خود ایجاد می کنید، یک “تعهد” در Git ایجاد می کنید، که به نوعی مانند عکس گرفتن از داستان خود در آن لحظه خاص است. این commit ها به ترتیب زمانی سازماندهی شده اند، که به شما یک جدول زمانی از روند نوشتن شما می دهد.
اگر تصمیم دارید با خط داستانی یا توسعه شخصیت متفاوت آزمایش کنید، می توانید یک “شاخه” جدید در Git ایجاد کنید. این شاخه مانند یک جهان موازی است که در آن می توانید تغییراتی را بدون تأثیرگذاری بر خط داستانی اصلی ایجاد کنید. میتوانید بین شاخهها جابهجا شوید، ایدههای مختلف را بررسی کنید و بعداً آنها را در داستان اصلی ادغام کنید.
ویژگیهای کنترل نسخه Git به شما این امکان را میدهد تا بدون زحمت در تاریخچه کتاب خود پیمایش کنید. میتوانید نسخههای مختلف را مقایسه کنید، ببینید چه تغییراتی ایجاد شدهاند، و حتی در صورت نیاز به پیشنویس قبلی برگردید.
درست مانند ماشین زمان که میتواند به نویسندگان کمک کند تا تکامل داستانهایشان را مدیریت کنند، Git نیز به توسعهدهندگان کمک میکند تا تغییرات یک پایگاه کد را ردیابی و مدیریت کنند، با دیگران همکاری کنند، ویژگیهای جدید را آزمایش کنند و سابقهای از تاریخچه پروژه ایجاد کنند.
مزایای Git در توسعه مشارکتی
از لحاظ تاریخی، همکاری در کد شامل اشتراکگذاری دستی فایل یا نگهداری نسخههای متعدد بود. اگر خوش شانس باشید، نمی دانید که این اغلب چقدر گیج کننده و ناکارآمد است. Git با ارائه ذخیرهسازی کد مرکزی و سوابق تغییرات، این چالشها را برطرف کرد.
ویژگی ها و مزایای Git
-
توسعه غیر متمرکز– با Git، هر یک از اعضای تیم مخزن مخصوص به خود را در ماشین محلی خود دارند – همچنین به نام یک کپی محلی – که امکان کار مستقل بدون نیاز به اتصال به اینترنت را فراهم می کند.
-
همگام سازی بدون دردسر– با شبیه سازی مخازن، اعضای تیم می توانند کپی های محلی از پایگاه کد ایجاد کنند. این بدان معناست که هرکس نسخه خود را برای کار کردن دارد و می تواند از Git برای به اشتراک گذاشتن تغییرات بین مخازن استفاده کند.
شروع کار با Git
اگر میخواهید تجربه عملی در استفاده از git داشته باشید، دوره مقدماتی OpenSauced را برای منبع باز بررسی کنید یا در یکی از کارگاههای ما ثبتنام کنید که در پایین اسناد چالش #100DaysOfOSS ما ذکر شده است.
مخازن از راه دور و همکاری
Git با فعال کردن توسعه دهندگان برای کار بر روی همان پایگاه کد از مکان های راه دور، امکان همکاری را فراهم می کند.
شبیه سازی یک مخزن
شبیه سازی فرآیند ایجاد یک کپی از یک مخزن راه دور بر روی ماشین محلی شما است. هنگامی که یک مخزن را شبیه سازی می کنید، یک نسخه محلی ایجاد می کنید که شامل کل پایگاه کد، تاریخچه تعهدات، شاخه ها و سایر اطلاعات مربوط به مخزن است.
To clone a remote repository:
$ git clone <repository-url>
انشعاب
شاخهبندی و ادغام به چندین توسعهدهنده اجازه میدهد به طور همزمان روی یک پایه کد کار کنند و بروز تضادها را کاهش میدهد.
To create a new branch:
$ git branch <branch-name>
باید نام شعبه جدید خود را جایگزین کنید. به عنوان مثال، اگر می خواهید شاخه ای به نام “feature-x” ایجاد کنید، از دستور زیر استفاده می کنید:
$ git branch feature-x
انجام تغییرات
انجام تغییرات بخشی از عملکرد اصلی Git است. به یاد داشته باشید، commit کردن مانند گرفتن یک عکس فوری از شکلی است که پایگاه کد در آن لحظه به نظر می رسد. پیام commit شرحی از تغییراتی است که ایجاد کرده اید. در اینجا یک مثال است:
To commit changes:
$ git commit -m "Your commit message"
سناریو: تصور کنید یک ویژگی جدید اضافه کرده اید و می خواهید پیشرفت خود را ذخیره کنید. با انجام تغییرات خود، یک عکس فوری از کد در آن نقطه خاص ایجاد میکنید که ردیابی و بازگردانی آن در صورت نیاز آسان میشود.
فشار دادن تغییرات
وقتی تغییرات را فشار می دهید، به این معنی است که تغییرات، تعهدات و شاخه های کد محلی خود را به یک مخزن راه دور ارسال می کنید. شما در حال به روز رسانی مخزن راه دور با commit های محلی خود هستید و آنها را برای دیگرانی که به همان مخزن دسترسی دارند در دسترس قرار می دهید.
To push changes to a remote repository:
$ git push origin <branch-name>
با فشار دادن تغییرات، تغییرات محلی ذخیره شده شما با دیگران به اشتراک گذاشته می شود. سپس سایر اعضای تیم می توانند تغییرات شما را در مخازن محلی خود واکشی و ادغام کنند و یک نسخه به روز از پروژه ایجاد کنند.
ادغام و واکشی
ادغام: ادغام فرآیند ترکیب تغییرات از یک شاخه یا commit به شاخه دیگر است.
دستور git merge <branch-name>
برای ادغام تغییرات از یک شاخه به شاخه دیگر استفاده می شود. در این صورت جایگزین کنید <branch-name>
با نام شاخه ای که می خواهید در شاخه فعلی خود ادغام کنید. به عنوان مثال، اگر می خواهید تغییرات را از شاخه ای به نام “main” در شاخه فعلی خود ادغام کنید، از دستور زیر استفاده می کنید:
$ git merge main
سناریو: شما در حال کار بر روی یک پروژه تیمی هستید و باید یک ویژگی جدید را بدون تداخل با پایگاه کد اصلی توسعه دهید. با ایجاد یک شعبه، می توانید کار خود را ایزوله کنید، تغییراتی را انجام دهید و پس از آماده شدن دوباره آنها را در شاخه اصلی ادغام کنید. اگر بهروزرسانیهایی در شعبه اصلی انجام شده است که باید به شعبه خود اضافه کنید، میتوانید آنها را نیز در آن ادغام کنید.
واکشی: فرآیند بازیابی تغییرات از یک مخزن راه دور بدون ادغام خودکار آنها در شعبه محلی شما. وقتی واکشی میکنید، Git تاریخچه commit را بین مخزن محلی و مخزن راه دور مقایسه میکند و هر commit یا شاخه جدیدی را در مخزن راه دور که به صورت محلی ندارید شناسایی میکند.
To fetch changes from a remote repository:
$ git fetch <remote>
گاهی اوقات تداخل ادغام وجود دارد (به عنوان مثال، تغییرات در همان خطوط کد). هنگامی که این اتفاق می افتد، Git از شما می خواهد که تضادها را به صورت دستی حل کنید.
برای حل تضادهای ادغام، باید به بخشهای متضاد نگاه کنید، فایلها را ویرایش کنید، تضاد را حذف کنید و سپس تغییرات جدید را انجام دهید.
اگر می خواهید همزمان واکشی و ادغام کنید – که راحت است اما انعطاف کمتری را فراهم می کند – می توانید این دستور را اجرا کنید:
$ git pull origin <branch-name>
Git Stash
تصور کنید در وسط کار بر روی یک شاخه ویژگی هستید، اما ناگهان باید برای رفع اشکال به شاخه دیگری بروید. به جای انجام تغییرات ناتمام یا از دست دادن آنها، می توانید از Git stash برای ذخیره موقت تغییرات خود استفاده کنید. این به شما امکان میدهد به شاخه رفع اشکال بروید، مشکل را برطرف کنید و سپس به شاخه ویژگی خود برگردید و ذخیره ذخیرهشده را اعمال کنید تا از جایی که کار را متوقف کردهاید ادامه دهید.
برای مخفی کردن تغییرات خود، دستور زیر را اجرا کنید:
$ git stash save "Stash message"
برای مشاهده لیستی از مخفیگاه های خود، می توانید از دستور زیر استفاده کنید:
$ git stash list
هنگامی که آماده اعمال تغییرات پنهان شده خود به فهرست کاری خود هستید، از دستور استفاده کنید:
$ git stash apply
اگر چند مخفی نگه دارید، می توانید با استفاده از شناسه یا نمایه آن، مخفیگاه خاصی را مشخص کنید (git stash apply stash@{2}
).
اگر دیگر نیازی به ذخیرهسازی ندارید، میتوانید با اجرای:
$ git stash drop
برای اعمال یک stash و حذف آن از فهرست ذخیره در یک مرحله، می توانید از دستور استفاده کنید:
$ git stash pop
این معادل اجرای git stash است و به دنبال آن git stash drop برای آخرین stash است.
Git Rebase
فرض کنید مدتی است که روی یک شاخه ویژگی کار می کنید، اما در این مدت، شاخه اصلی چندین commit جدید داشته است. قبل از ادغام شاخه ویژگی خود، می توانید از Git rebase استفاده کنید تا آخرین تغییرات را از شاخه اصلی در شاخه خود بگنجانید. این اطمینان حاصل می کند که شاخه ویژگی شما به روز است و از تضادهای احتمالی در طول فرآیند ادغام جلوگیری می کند.
در اینجا یک نمای کلی از نحوه استفاده از Git Rebase آورده شده است:
- یک Rebase را شروع کنید: برای شروع یک rebase، مطمئن شوید که در شاخه ای هستید که می خواهید تغییرات را در آن اعمال کنید (شاخه هدف). سپس دستور زیر را اجرا کنید:
$ git rebase <branch-name>
حتما تعویض کنید <branch-name>
با نام شعبه ای که شامل commit هایی است که می خواهید روی شاخه هدف اعمال کنید.
-
تضادها را حل کنید: در طول فرآیند rebase، اگر تغییرات متناقضی بین commit های اعمال شده و commit های موجود در شاخه هدف وجود داشته باشد، Git ممکن است با تداخل هایی مواجه شود. Git ریبس را متوقف می کند و از شما می خواهد که این تضادها را به صورت دستی حل کنید. می توانید از ابزارهای حل تعارض Git استفاده کنید، مانند ویرایش فایل های متناقض، انتخاب تغییرات مورد نظر و استفاده از
git add
برای علامت گذاری درگیری ها به عنوان حل شده -
Rebase را ادامه دهید: پس از رفع تداخل برای یک commit خاص، میتوانید با اجرای:
$ git rebase --continue
این commit حل شده را اعمال می کند و با commit های باقی مانده در دنباله ادامه می دهد.
- Rebase را لغو کنید: اگر تصمیم به لغو rebase دارید، میتوانید با اجرای:
$ git rebase --abort
با این کار شاخه شما به حالت قبل از شروع مجدد باز می گردد.
مهم است که توجه داشته باشید که Git rebase با اعمال تغییرات از یک شاخه بر روی شاخه دیگر، تاریخچه commit را بازنویسی می کند.
کارهای بیشتری می توانید با Git انجام دهید، و می دانم که ممکن است طاقت فرسا به نظر برسد، اما به آن مانند یک جعبه ابزار فکر کنید. ابزارهای مختلف زیادی در آنجا وجود دارد و ممکن است فقط نحوه استفاده از پیچ گوشتی در چکش را بدانید، اما با پیشرفت در پروژه های مختلف، می توانید به یادگیری نحوه استفاده از ابزارهای دیگر در آنجا ادامه دهید. و وقتی این کار را انجام دهید، خواهید دید که همکاری در پروژه ها آسان تر می شود زیرا از ابزار مناسب استفاده می کنید.