سه روش برای پاکسازی برنچهای محلی Git
· 4 دقیقه مطالعهمهندسی #git #developer-productivity #workflow
برنچهای محلی خیلی زود زیاد میشوند. برای یک قابلیت، رفع باگ یا یک آزمایش کوتاه برنچ میسازید و بعد از Merge شدن Pull Request سراغ کار بعدی میروید. گاهی برنچ remote حذف میشود، گاهی تغییرات از قبل در main یا برنچ دیگری وارد شدهاند و گاهی روی برنچی هستید که remote آن مدتهاست از بین رفته اما خود برنچ هنوز روی سیستم شما مفید است.
این دستورها هر کدام یکی از این حالتها را پوشش میدهند.
حذف برنچهایی که از remote حذف شدهاند
از این روش بهعنوان نقطهی شروع استفاده میکنم، اما پیش از حذف، برنچها را بررسی میکنم.
Git Bash
git fetch -p && for branch in $(git branch -vv | grep ': gone]' | awk '{print $1}'); do git branch -D $branch; done
PowerShell
git fetch -p; git branch -vv | Select-String ': gone\]' | ForEach-Object { ($_ -split '\s+')[1] } | ForEach-Object { git branch -D $_ }
بعد از اینکه remote برنچ Pull Requestهای Mergeشده حذف شد، از این استفاده کنید. git fetch -p ارجاعهای قدیمی remote-tracking را پاک میکند و بقیهی دستور، برنچهای محلیای را که upstream آنها دیگر وجود ندارد با اجبار حذف میکند.
این دستور چیزی را روی remote حذف نمیکند و به برنچهای دارای upstream کاری ندارد.
-D بررسی کار Mergeنشدهی Git را دور میزند، پس حتی برنچهایی را هم حذف میکند که commitشان جای دیگری راه پیدا نکرده است. هیچ مرحلهی پیشنمایشی هم در کار نیست: بهمحض پیدا شدن یک برنچ با upstream حذفشده، آن را حذف میکند. اگر میخواهید پیش از حذف یک برنچ را بررسی کنید، اول git branch -vv | grep ': gone]' را اجرا کنید و هر برنچ را جداگانه با -d حذف کنید.
حذف برنچهایی که از قبل در main Merge شدهاند
گاهی برنچ remote هنوز وجود دارد، اما تغییراتش از قبل وارد main شدهاند. در این حالت بر اساس وضعیت Merge پاکسازی کنید.
Git Bash
git branch --merged main --format='%(refname:short)' | grep -vxE 'main|master|develop' | xargs -r -n1 git branch -d
PowerShell
git branch --merged main --format='%(refname:short)' | Where-Object { $_ -notin 'main', 'master', 'develop' } | ForEach-Object { git branch -d $_ }
از این روش زمانی استفاده کنید که تیم شما برنچهای remote را بعد از Merge نگه میدارد، یا فقط میخواهید کاری را که از قبل در main وارد شده حذف کنید.
main را با برنچ اصلی واقعی پروژهتان جایگزین کنید. این دستورها از -d استفاده میکنند، پس Git برنچی را که commitهای Mergeنشده دارد نگه میدارد.
حذف همهی برنچهای محلی بهجز main
فقط زمانی از این استفاده کنید که نیازی به نگهداشتن برنچهای قابلیت محلی ندارید؛ مثلاً بعد از تمام شدن یک دسته از کارها یا پیش از شروعی تازه در مخزنی که میتوانید برنچها را دوباره از remote بگیرید.
Git Bash
git switch main && git branch --format='%(refname:short)' | grep -vxE 'main|develop' | xargs -r git branch -D
PowerShell
git switch main; if ($LASTEXITCODE -eq 0) { git branch --format='%(refname:short)' | Where-Object { $_ -notin 'main', 'develop' } | ForEach-Object { git branch -D $_ } }
این کار همهی برنچهای محلی را بهجز main و develop حذف میکند، چه Merge شده باشند و چه هنوز برنچ remote داشته باشند.
main و develop را با برنچهایی که باید نگه دارید عوض کنید. اگر ممکن است کاری فقط بهصورت محلی مهم باشد، این دستور را اجرا نکنید.