فهرست مطالب
branch در گیت یک اشارهگر متحرک به یکی از کامیتهاست؛ نه کپیای از پوشهی پروژه و نه چیزی سنگین. وقتی branch میسازی، یک خط کار جدا میگیری که تغییرهایش به نسخهی اصلی سرریز نمیشود. main سالم میماند، تو راحت کد میزنی و اگر وسط راه خراب شد با یک switch برمیگردی و هیچ چیزی از دست نرفته است.
branch دقیقاً چیست؟
تعریف «اشارهگر» را جدی بگیر، چون همهی کاربردهای branch از همین یک جمله بیرون میآید. گیت برای هر branch فقط یک فایل ۴۱ بایتی نگه میدارد که داخلش هش یک کامیت نوشته شده. در مخزن آزمایشی که برای همین مطلب ساختم، دو فایل branch این بودند:
bash$ cat .git/refs/heads/main
5ecc8b417a483ca47f550437cf44f06f6627c17a
$ cat .git/refs/heads/feature/login
42a3865e0f5ad0d285e7e805a67d954d866230f4
main روی آخرین کامیت پروژه ایستاده و feature/login همانجای ساختهشدنش مانده. ساختن branch نه فایلی را کپی میکند و نه چیزی را دانلود میکند؛ فقط یک اسم جدید میسازد که به یک نقطه از تاریخچه اشاره میکند. هر کامیت تازهای که روی همان branch بزنی، این فایل بهروز میشود و اشارهگر جلو میرود؛ main هم تا وقتی خودت نخواهی، سر جایش میماند.
چهوقت باید branch بسازی؟
قاعدهی سادهی من این است که هر کاری که بیشتر از چند دقیقه طول بکشد، branch خودش را میگیرد. قابلیت تازه، تعمیر باگ، جابهجایی یک کتابخانه، حتی آزمایشی که احتمال میدهم دور بریزد. main همیشه همان نسخهای بماند که اگر همین امشب لازمش داشتی، آمادهی انتشار بود.
این کار مخصوص تیمهای چندنفره هم نیست. برنامهنویسی که تنهایی پروژه میسازد هم از branch بهره میبرد، چون مفهوم «نسخهی قابلاعتماد» و «نسخهی در حال ساختن» را از هم جدا نگه میدارد. چیزی که به درد نمیخورد، branchهای رهاشدهاند؛ بعد از merge پاکشان کن تا فهرست branchها دفترچهی خاطرات پروژه نشود.
چطور بسازم و بینشان جابهجا شوم؟
برای ساختن یک branch و پریدن روی آن، از git switch -c استفاده کن. این دستور از گیت ۲.۲۳ وجود دارد؛ در نسخههای قدیمیتر همان کار را git checkout -b میکند:
bash$ git switch -c feature/signup
Switched to a new branch 'feature/signup'
اگر فقط میخواهی branch ساخته شود ولی فعلاً سر جایت بمانی، همان را بدون -c بزن:
bash$ git branch feature/login
$ git branch
feature/login
* main
ستاره نشان میدهد الان کجا ایستادهای. برگشتن به main هم با همان switch انجام میشود:
bash$ git switch main
Switched to branch 'main'
دو خطا را هم زود یا دیر میبینی و هر دو بیضررند:
bash$ git switch -c feature/signup
fatal: a branch named 'feature/signup' already exists
$ git switch feacher/signup
fatal: invalid reference: feacher/signup
اولی یعنی این اسم قبلاً ساخته شده؛ سر جایت بمان و با switch خالی واردش شو. دومی یعنی چنین branchای وجود ندارد؛ در مخزن آزمایشی اسم را عمداً غلط نوشتم تا ببینی گیت چه جوابی میدهد. غلط تایپی در اسم branch را با همین پیام پیدا کن.
branch را چطور به main برگردانم و پاکش کنم؟
وقتی کار تمام شد، تغییرها را به main برمیگردانی:
bash$ git switch main
$ git merge feature/signup
Updating 42a3865..df61641
Fast-forward
signup.txt | 1 +
1 file changed, 1 insertion(+)
پیام Fast-forward یعنی main از موقع ساختن branch جلو نرفته بود و گیت فقط اشارهگر را به انتهای کار تو کشید. اگر main هم جلو رفته باشد و دو تاریخچه برخورد کنند، تعارض میشود؛ راهحل کاملش را در مطلب حل تعارض در merge گیت نوشتهایم. اگر هم تاریخچهی شلوغی داری و ترجیح میدهی بهجای merge گرهها را صاف کنی، مقایسهی rebase در برابر merge را بخوان.
حالا branch بیکار شده و پاکش کن:
bash$ git branch -d feature/signup
Deleted branch feature/signup (was df61641).
اگر کامیتهای آن branch هنوز merge نشده باشند، گیت نمیگذارد پاک شود:
bash$ git branch -d exp
error: the branch 'exp' is not fully merged
hint: If you are sure you want to delete it, run 'git branch -D exp'
این هشدار را نگه دار؛ یعنی احتمالاً کاری روی آن branch مانده که هیچجای دیگر ذخیره نشده. اگر مطمئنی کار دور انداختن است، همان پیشنهاد گیت را اجرا کن و با -D پاکش کن. فرق d کوچک و D بزرگ همینجاست.
main یا master؟
نام branch اول پروژه در نسخههای قدیمی گیت master بود. از گیت ۲.۲۸ تنظیم init.defaultBranch آمد تا هر کس اسم دلخواهش را بگذارد، و گیتهاب هم از اکتبر ۲۰۲۰ مخزنهای تازه را روی main میسازد. این روزها main رایجتر است، ولی اسم اصلاً ماجرا نیست؛ مهم این است که همهی تیم یک اسم بگویند و بمانند. اگر مخزن تازه میسازی، git config --global init.defaultBranch main یک بار برای همیشه تصمیم را میگیرد.
از کجا تمرینش کنم؟
این مفهوم با خواندن جا نمیافتد؛ باید چند branch بسازی، بینشان پرش کنی و چندتایی را هم پاک کنی. در دورهی آموزش گیت و گیتهاب همین کار را در مرورگر انجام میدهی؛ بدون نصب چیزی، دستورها را میزنی و خروجی را همانجا میبینی. برای شروع هم لازم منتظر پروژهی بزرگ نمانی؛ همین امروز روی پروژهی خودت یک branch بساز، یک تعمیر کوچک داخلش انجام بده و بعد از merge پاکش کن. حالش را میبری که main دستنخورده مانده باشد.





نظرها
اولین نفری باشید که نظر میدهدسؤالتان را بپرسید یا تجربهتان را بنویسید تا نویسندهی مطلب پاسخ بدهد.