ادغام تضادها و ادغام های سه طرفه
نظریه پشت شاخه و ادغام
هر زمان که شخصی در مورد شعبهها در Git صحبت میکند، درک اساسی این است که راهی برای پشتیبانی از کار موازی در بین چندین توسعهدهنده است.
اما، این پست اکنون اطلاعاتی در مورد نحوه عملکرد شاخه ها در Git ارائه می دهد.
در هسته خود، شاخه ها در Git نشانگرهای متحرک به commit های خاص هستند. هنگامی که یک شعبه ایجاد می کنید، در اصل به SHA یک commit خاص در گزارش Git یک نام می دهید. با ایجاد commit های جدید در آن شاخه، نشانگر به طور خودکار به آخرین commit منتقل می شود.
SHA و شعبه مربوطه را متعهد کنید
افزودن ویژگی به پروژه من
این هفته به دلیل اضافه شدن دو ویژگی جدید در پروژه خود، DialectMorph، مجبور شدم روند کار با چندین شاخه و همچنین حل تضادهای متعدد را طی کنم.
ویژگی اول
من در پایگاه کد خود مشاهده کردم که اکثر توابع مربوط به کلاس Singleton برای Groq Client فاقد بلوک های خطای try and catch هستند و پیام خطای صحیحی برای همان خطا ندارند همچنین تابع CLI هنگام خروج از برنامه دارای کدهای خطای متناقض است. من برای حل این مشکل مشکلی را به مخزن GitHub خود اضافه کردم
من یک شعبه ساختم و اسمش را به خاطر موضوعی که در گیت هاب باز شد، گذاشتم، در این مورد، همینطور بود issue-22
.
ویژگی دوم
ابزار CLI فقط از Groq API برای انتقال فایلها پشتیبانی میکرد، من میخواستم از افزودن یک API دیگر برای ارائه طیف متنوعی از مدلهای LLM که کاربر میتواند برای تولید فایلهای ترجمهشده انتخاب کند، پشتیبانی کنم، بنابراین تصمیم گرفتم Gemini API را نیز اضافه کنم. . در شماره جدیدی که در GitHub باز کرده بودم، توضیحی در مورد ویژگی هایی که قرار بود در ویژگی Gemini API گنجانده شود اضافه کردم، شروع به کار در شعبه کردم. issue-23
که شماره ای بود که به این شماره در GitHub اختصاص داده شد.
ادغام سریع به جلو
پس از پایان کار بر روی شماره 22، تصمیم گرفتم تغییرات را در محلی ادغام کنم main
شعبه، این بدان معناست که باید دستور زیر را انجام دهم
git checkout main
git merge issue-22
اکنون از آنجایی که من هیچ تعهدی در شاخه اصلی خود انجام نداده بودم، ادغام که در اینجا اجرا می شود، من را به سرعت به جلو می برد. main
شاخه به آخرین commit در issue-22
شعبه، برای بهتر نشان دادن این، من یک نمودار دارم که نشان می دهد چگونه این کار می کند
ادغام سریع به جلو issue-22
به main
شاخه
همانطور که از نمودار مشاهده می شود، پس از اتمام ادغام، شاخه اصلی با تغییرات ادغام/به روز شده به commit جدید منتقل می شود.
نسخه توصیفی کامل commit ادغام من را می توانید در اینجا پیدا کنید
ادغام سه طرفه و تضادها
بعد از اینکه کارم تمام شد issue-23
، که در حال اضافه کردن پشتیبانی از Gemini Client در پایگاه کد من بود، من دوباره می خواستم تغییرات را در شعبه اصلی محلی خود ادغام کنم، اما این بار از زمان من main
شعبه به دلیل ادغام قبلی، تعهدات جدیدی داشت issue-22
شعبه، ادغام یک ادغام سه طرفه خواهد بود و این همه ماجرا نیست، من حتی این بار چند تضاد ادغام داشتم.
برای شروع در مورد اینکه ادغام سه طرفه چیست، باید یک مثال ساده را با کمک یک نمودار نشان دهم.
من سه شعبه دارم: main
، issue-22
، و issue-23
. من هر دو را ایجاد کردم issue-22
و issue-23
از همان commit (یا عکس فوری) روی main
شاخه بعد از آن کار را شروع کردم issue-22
، تغییراتی ایجاد کرد و یک ادغام سریع به جلو به داخل انجام داد main
شاخه
در حین کار بر روی issue-22
، من هم در حال پیشرفت بودم issue-23
، و اکنون ویژگی را در آن تکمیل کرده ام issue-23
شاخه با این حال، وقتی میخواهم ادغام کنم، مشکلی وجود دارد issue-23
به main
– main
شعبه قبلاً تعهداتی از طرف دارد issue-22
ادغام، به این معنی که ادغام سریع به جلو دیگر امکان پذیر نیست.
این بار، من باید از چیزی که a نامیده می شود استفاده کنم ادغام سه طرفه. در این فرآیند، Git جد مشترک بین را شناسایی می کند main
شعبه و issue-23
شاخه این جد مشترک، که به عنوان commit یا عکس فوری “پایه” نامیده می شود، برای ادغام تغییرات از هر دو شاخه و حل هرگونه تضاد ادغام بین این دو استفاده می شود – در این مورد، بین main
و issue-23
.
یک نمای توصیفی کامل از این را می توان در اینجا یافت
نتیجه گیری
من معتقدم بهترین بخش در مورد مهندس نرم افزار/توسعه دهنده بودن این است که بدانید چه کاری انجام می دهید، اما در عین حال اینکه نمی دانید چگونه می توانید این کار را انجام دهید، این هفته این را برای من ثابت کرد، من از همان ابتدا می دانستم که چگونه من میتواند تغییرات من را ادغام کند، اما هرگز نمیدانستم که باید از پیچیدگیهای انواع مختلف ادغام و تضادها عبور کنم. اما صادقانه بگویم، من از بررسی ویژگیهایی که میدانستم در Git وجود دارند، اما قبلاً آنها را امتحان نکرده بودم، لذت میبرم.