Chapters ▾ 2nd Edition

A3.4 پیوست C: دستورات گیت (Git Commands) - انشعاب‌گیری و ادغام (Branching and Merging)

انشعاب‌گیری و ادغام (Branching and Merging)

تنها تعداد اندکی از دستورات وجود دارند که بخش اعظم عملکرد شاخه‌بندی و ادغام در گیت را پیاده‌سازی می‌کنند.

مدیریت شاخه‌ها در گیت (git branch)

دستور git branch در واقع نوعی ابزار مدیریت شاخه است. این دستور می‌تواند شاخه‌های موجود را فهرست کند، شاخهٔ جدید ایجاد کند، شاخه‌ها را حذف کند و نام شاخه‌ها را تغییر دهد.

بخش عمده‌ای از فصل انشعاب‌گیری در گیت (Git Branching) به دستور branch اختصاص دارد و در سرتاسر فصل از آن استفاده شده است. ابتدا آن را در ایجاد یک شاخه جدید (Creating a New Branch) معرفی می‌کنیم و اکثر ویژگی‌های دیگر آن (فهرست‌کردن و حذف) را در مدیریت شاخه‌ها (Branch Management) بررسی می‌کنیم.

در شاخه‌های دنبال‌کننده (Tracking Branches) از گزینه git branch -u برای تنظیم شاخهٔ دنبال‌شونده (tracking branch) استفاده می‌کنیم.

در نهایت، بخش‌هایی از کاری که در پس‌زمینه انجام می‌دهد را در مراجع گیت (Git References) مرور می‌کنیم.

تغییر شاخه یا بازیابی فایل در گیت (git checkout)

دستور git checkout برای سویچ‌کردن بین شاخه‌ها و چک‌اوت (برگرداندن محتوا) به شاخه کاری شما استفاده می‌شود.

برای اولین بار این دستور را همراه با دستور git branch در تغییر شاخه (Switching Branches) می‌بینیم.

می‌آموزیم چگونه با استفاده از گزینه --track برای شروع دنبال‌کردن شاخه‌ها اقدام کنیم در شاخه‌های دنبال‌کننده (Tracking Branches).

با استفاده از --conflict=diff3 از آن برای بازگرداندن (reintroduce) تداخلات فایل‌ها استفاده می‌کنیم در Checking Out Conflicts (بررسی تعارض‌ها).

روابط آن با git reset را با جزییات بیشتر در بازنشانی به زبان ساده (Reset Demystified) بررسی می‌کنیم.

در نهایت، برخی جزئیات پیاده‌سازی را در نشانگر HEAD (The HEAD) شرح می‌دهیم.

ادغام شاخه‌ها در گیت (git merge)

ابزار git merge برای ادغام یک یا چند شاخه در شاخهٔ فعلی که چک‌اوت کرده‌اید به کار می‌رود. سپس شاخهٔ جاری را به نتیجهٔ ادغام جلو می‌برد.

دستور git merge اولین‌بار در شاخه‌بندی پایه‌ای (Basic Branching) معرفی شد. اگرچه در فصل‌های مختلف کتاب از آن استفاده شده، اما تنوع‌های دستور merge بسیار محدود است — معمولاً فقط git merge <branch> با نام تک شاخه‌ای که می‌خواهید با آن ادغام کنید.

نحوه انجام ادغام به‌صورت squash (جایی که گیت کارها را ادغام می‌کند اما طوری رفتار می‌کند که گویی فقط یک کامیت جدید است و تاریخچهٔ شاخهٔ ادغام‌شونده را ثبت نمی‌کند) را در انتهای پروژه‌ی عمومی فورک شده (Forked Public Project) بررسی کردیم.

در مورد فرایند و دستور merge مطالب زیادی گفتیم، از جمله گزینهٔ -Xignore-space-change و فلگ --abort برای متوقف کردن یک ادغام مشکل‌دار در ادغام پیشرفته (Advanced Merging).

همچنین یاد گرفتیم که چگونه قبل از ادغام امضاها را در صورتی که پروژه‌تان از امضای GPG استفاده می‌کند، تأیید کنیم، که در امضای کامیت‌ها (Signing Commits) آمده است.

در نهایت در مورد Subtree merging در ادغام Subtree (Subtree Merging) بحث کردیم.

ابزار ادغام در گیت (git mergetool)

دستور git mergetool صرفاً در صورتی که هنگام ادغام با مشکل مواجه شوید یک ابزار خارجی کمکِ ادغام را راه‌اندازی می‌کند.

ما به‌طور مختصر آن را در مرج کانفیلیکت پایه (Basic Merge Conflicts) ذکر کرده‌ایم و در ابزارهای خارجی ادغام و مقایسه (External Merge and Diff Tools) به تفصیل توضیح داده‌ایم که چگونه می‌توانید ابزار ادغام خارجی خود را پیاده‌سازی کنید.

نمایش تاریخچه گیت (git log)

دستور git log برای نمایش تاریخچهٔ قابل دسترس ثبت‌شدهٔ یک پروژه از آخرین اسنپ‌شات کامیت به عقب استفاده می‌شود. به‌طور پیش‌فرض تنها تاریخچهٔ شاخه‌ای را که در آن قرار دارید نشان می‌دهد، اما می‌توان به آن سرها یا شاخه‌های مختلف یا حتی متعدد داد تا از آن‌ها عبور کند. همچنین اغلب برای نمایش تفاوت‌ها بین دو یا چند شاخه در سطح کامیت به‌کار می‌رود.

این دستور تقریباً در هر فصل کتاب برای نمایش تاریخچهٔ یک پروژه استفاده شده است. فرمان را معرفی می‌کنیم و آن را در مشاهده تاریخچه کامیت‌ها (Viewing the Commit History) به‌صورت نسبتاً عمیق پوشش می‌دهیم. در آن‌جا به گزینه‌های -p و --stat می‌پردازیم تا ایده‌ای از تغییراتی که هر کامیت وارد کرده بدست آوریم و از گزینه‌های --pretty و --oneline برای مشاهده فشرده‌تر تاریخچه استفاده می‌کنیم، همراه با چند گزینه ساده برای فیلتر کردن بر اساس تاریخ و مؤلف.

در ایجاد یک شاخه جدید (Creating a New Branch) آن را با گزینه --decorate به کار می‌بریم تا به‌راحتی محل اشاره‌گرهای شاخه‌ها را ببینیم و همچنین از گزینه --graph استفاده می‌کنیم تا ببینیم تاریخچه‌های منشعب چگونه به نظر می‌رسند.

در تیم کوچک خصوصی (Private Small Team) و بازه‌های کامیت (Commit Ranges) نحو branchA..branchB را پوشش می‌دهیم تا با استفاده از دستور git log ببینیم کدام کامیت‌ها نسبت به شاخه‌ی دیگر منحصر به همان شاخه‌اند. در بازه‌های کامیت (Commit Ranges) این موضوع را نسبتاً مفصل بررسی می‌کنیم.

در گزارش ادغام (Merge Log) و سه نقطه (Triple Dot) از فرمت branchA…​branchB و نحو --left-right برای دیدن اینکه چه چیزهایی در یکی از شاخه‌ها هست ولی در هر دو نیست، استفاده می‌کنیم. در گزارش ادغام (Merge Log) همچنین می‌بینیم چگونه از گزینه --merge برای کمک به اشکال‌زدایی تداخل‌های مرج و از گزینه --cc برای بررسی تداخل‌های کامیت‌های مرج در تاریخچه‌تان بهره ببریم.

در نام‌های کوتاه RefLog (RefLog Shortnames) از گزینه -g برای مشاهده reflog گیت از طریق این ابزار به جای گشتن در شاخه‌ها استفاده می‌کنیم.

در جستجو (Searching) به استفاده از گزینه‌های -S و -L برای انجام جستجوهای نسبتاً پیشرفته درباره چیزی که به‌صورت تاریخی در کد اتفاق افتاده، مانند مشاهدهٔ تاریخچهٔ یک تابع، می‌پردازیم.

در امضای کامیت‌ها (Signing Commits) می‌بینیم چگونه از --show-signature برای افزودن یک رشتهٔ اعتبارسنجی به هر کامیت در خروجی git log استفاده کنیم تا مشخص شود آیا آن کامیت به‌درستی امضا شده است یا خیر.

ذخیره موقت تغییرات در گیت (git stash)

دستور git stash برای ذخیره موقت کارهای انجام‌نشده (uncommitted) استفاده می‌شود تا بدون نیاز به کامیت کردن کار نیمه‌تمام روی یک شاخه، پوشهٔ کاری خود را پاک‌سازی کنید.

این موضوع عملاً کاملاً در ذخیره موقت و پاک‌سازی (Stashing and Cleaning) پوشش داده شده است.

ایجاد یا مدیریت برچسب‌ها در گیت (git tag)

دستور git tag برای گذاشتن یک نشانهٔ دائمی روی یک نقطهٔ مشخص در تاریخچه کد استفاده می‌شود. عموماً از این برای مواردی مثل انتشارها (ریلیزها) استفاده می‌شود.

این دستور در تگ کردن (Tagging) معرفی و با جزئیات توضیح داده شده و در عمل در برچسب‌گذاری نسخه‌های خود (Tagging Your Releases) هم از آن استفاده می‌کنیم.

همچنین نحوهٔ ساخت یک تگ امضا‌شده با GPG با گزینهٔ -s و تأیید آن با گزینهٔ -v در Signing Your Work (امضای کارهای شما) پوشش داده شده است.

scroll-to-top