کار با Branch و Merge در گیت
مقدمه
فرض کنید یک تیم دو نفره به نامهای سارا و امیر روی یک پروژه وب کار میکنند. سارا مسئول توسعه کدهای مربوط به کار با دیتابیس است و امیر توسعهدهنده بکاند است که روی منطق سرور و پردازش دادهها کار میکند. برای اینکه تغییرات هر کدام به صورت مستقیم روی کار دیگری تأثیر نگذارد، هر کدام یک Branch جداگانه ایجاد میکنند. سارا در شاخه خودش روی ارتباط با دیتابیس کار میکند و امیر در شاخه خودش روی پردازش درخواستها و منطق برنامه کار میکند. در نهایت، وقتی هر دو تغییرات خود را کامل کردند، از Merge برای ادغام آنها در شاخه اصلی استفاده میکنند. این روش باعث میشود پروژه به شکل منظم و بدون تداخل پیش برود.
ایجاد و تغییر Branch
فرض کنید امیر میخواهد قابلیت «ورود کاربر» را پیادهسازی کند. او برای این کار یک شاخه جدید به نام user-login
ایجاد میکند:
git branch user-login
اکنون برای کار روی این قابلیت باید به این شاخه برود:
git checkout user-login
یا در نسخههای جدید گیت، این دو مرحله را در یک دستور ترکیب میکند:
git switch -c user-login
برای بررسی شاخهای که در آن هستید و لیست شاخهها:
git branch
شاخه فعال با علامت ستاره *
مشخص میشود. مثلا اگر امیر همین حالا شاخه را ساخته باشد، خروجی ممکن است اینطور باشد:
main
* user-login
استفاده از merge برای ادغام تغییرات
پس از اتمام پیادهسازی قابلیت ورود، امیر تغییرات خود را commit کرده است. حالا میخواهد آنها را به شاخه اصلی پروژه (main) بیاورد:
- رفتن به شاخه مقصد:
git checkout main
- انجام عملیات merge:
git merge user-login
اگر تغییرات جدید با کد شاخه main تداخلی نداشته باشند، عملیات ادغام به صورت خودکار انجام میشود و خروجی چیزی شبیه به این خواهد بود:
Updating a1b2c3d..e4f5g6h
Fast-forward
login.js | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
رفع تعارضها (Merge Conflicts)
فرض کنید هم امیر در شاخه user-login
و هم سارا در شاخه db-update
تغییراتی روی فایل auth.js
دادهاند. هنگام ادغام، گیت پیام زیر را نمایش میدهد:
Auto-merging auth.js
CONFLICT (content): Merge conflict in auth.js
Automatic merge failed; fix conflicts and then commit the result.
نکته مهم این است که «تعارض» یا همان conflict برخلاف اسمش چیز بدی نیست. این وضعیت کاملا طبیعی است و در پروژههای تیمی مکرراً رخ میدهد. فقط کافی است توسعهدهنده با حوصله آن را بررسی و رفع کند تا بهترین نسخه نهایی حاصل شود.
برای رفع تعارض:
- امیر فایل
auth.js
را باز میکند. - بخشهایی که با
<<<<<<<
,=======
, و>>>>>>>
مشخص شدهاند را ویرایش میکند تا نسخه نهایی مد نظر تیم باقی بماند. - فایل را ذخیره میکند.
- تغییرات را به استیج اضافه میکند:
git add auth.js
- سپس یک commit برای تکمیل عملیات ادغام میزند:
git commit
جمعبندی
در این پست با مثالهای واقعی از پروژه امیر و سارا یاد گرفتیم چطور شاخه بسازیم، تغییرات را در شاخه خود اعمال کنیم، آنها را با شاخه اصلی ادغام کنیم و در صورت بروز تعارض، مشکل را حل کنیم. Branch و Merge ابزارهای ضروری برای توسعه تیمی و جلوگیری از بههمریختگی کد هستند.
تمرین کوچک
- یک مخزن جدید ایجاد کنید یا از مخزن موجود استفاده کنید.
- یک شاخه جدید بسازید و در آن تغییرات انجام دهید.
- تغییرات را commit کنید.
- به شاخه اصلی برگردید و تغییرات شاخه جدید را merge کنید.
- اگر تعارضی ایجاد شد، آن را برطرف کرده و commit کنید.
پینوشت
ایجاد یک مخزن جدید در گیت به معنای ساخت یک دایرکتوری برای پروژه و سپس اجرای دستور git init
در آن است. این دستور یک دایرکتوری مخفی به نام .git
میسازد که تمامی اطلاعات و تاریخچه تغییرات پروژه در آن ذخیره میشود.