ادغام شاخهها
پیشنمایش دستور
استفاده
git merge [گزینهها] <شاخه>
موارد کاربرد رایج
- ادغام یک شاخه دیگر به شاخه جاری:
git merge feature - ایجاد commit ادغام حتی اگر fast-forward ممکن باشد:
git merge --no-ff feature - ترکیب کامیتها بدون انجام commit:
git merge --squash feature - لغو عملیات merge:
git merge --abort
مثالها
git merge feature # Merge 'feature' into current branch git merge --no-ff feature # Create merge commit even if fast-forward git merge --squash feature # Combine commits without committing git merge --abort # Abort an ongoing merge git merge --commit # Perform commit (default) git merge --no-commit # Merge but do not commit git merge --strategy=recursive -X theirs feature # Use 'theirs' option with recursive strategy
محدودیتها
- نمیتوان merge انجام داد اگر تغییرات ذخیرهنشده وجود داشته باشد که با شاخه مورد نظر تضاد داشته باشد
- تضادهای merge باید دستی حل شوند
- merge fast-forward ممکن است commit ایجاد نکند مگر --no-ff استفاده شود
گزینهها
- --no-ff : ایجاد commit ادغام حتی اگر fast-forward ممکن باشد
- --ff : اجازه fast-forward merge (پیشفرض)
- --ff-only : فقط اگر fast-forward ممکن باشد ادغام انجام شود
- --squash : ترکیب کامیتها بدون commit
- --commit / --no-commit : کنترل commit خودکار
- --abort : لغو merge در حال اجرا
- --edit / -e : ویرایش پیام commit ادغام
- --strategy <strategy> : مشخص کردن استراتژی merge
- -X <option> : ارسال گزینه به استراتژی merge (مثلاً ours, theirs)
- --no-verify : رد کردن pre-merge hookها
- --quiet / -q : کاهش خروجی
دقیقا چه میکند؟
دستور git merge برای ادغام تغییرات از یک شاخه به شاخه دیگر استفاده میشود. این دستور بهطور معمول برای ترکیب شاخههای ویژگی به شاخههای اصلی یا توسعه استفاده میشود. commitهای merge به حفظ تاریخچه هر دو شاخه کمک میکنند و امکان دنبال کردن تغییرات را فراهم میکنند.
مقایسه با git rebase
مقایسه ویژگیها
| ویژگی | git merge |
git rebase |
|---|---|---|
| هدف | ادغام تغییرات از یک شاخه به شاخه دیگر، حفظ تاریخچه | انتقال یا ترکیب commitها از یک شاخه به شاخه دیگر، بازنویسی تاریخچه |
| حفظ تاریخچه commit | بله، ایجاد commit ادغام | خیر، commitها دوباره اجرا میشوند و تاریخچه بازنویسی میشود |
| مدیریت تضادها | تضادهای merge باید بهصورت دستی حل شوند و commit ادغام ایجاد میشود | تضادهای rebase باید بهصورت دستی حل شوند، هیچ commit ادغامی ایجاد نمیشود |
| موارد استفاده | وقتی میخواهید تاریخچه کامل شاخهها را حفظ کنید و ببینید که چگونه از هم جدا شدهاند | وقتی میخواهید تاریخچه خطی ایجاد کنید و از commitهای merge جلوگیری کنید |
اشتباهات رایج
- فراموش کردن commit یا stash تغییرات قبل از merge، که ممکن است منجر به تضاد شود.
- حل نکردن صحیح تضادهای merge، که ممکن است باعث از دست رفتن کار شود.
- استفاده از fast-forward merge زمانی که به یک commit ادغام نیاز دارید تا تاریخچه شاخهها حفظ شود.
بهترین شیوهها
- همیشه قبل از انجام merge تغییرات خود را commit یا stash کنید تا از تضاد جلوگیری شود.
- اگر میخواهید تاریخچه هر دو شاخه را حفظ کنید، از
--ff-onlyاستفاده نکنید. - برای اطمینان از ایجاد commit ادغام حتی در مواقعی که merge fast-forward امکانپذیر است، از
--no-ffاستفاده کنید. - بعد از حل تضادهای merge، تغییرات خود را با دقت بازبینی کنید قبل از انجام commit.
محدودیتها
- شما نمیتوانید merge انجام دهید اگر تغییرات ذخیرهنشدهای وجود داشته باشد که با شاخه مورد نظر تضاد داشته باشد.
- تضادهای merge باید بهصورت دستی حل شوند که ممکن است گاهی در پروژههای بزرگ دشوار باشد.
- استفاده از
--ffاجازه میدهد که merge سریع انجام شود، اما ممکن است commit ادغام که برای مرجع در آینده مفید باشد را از دست بدهید.
نحوه استفاده
برای ادغام تغییرات از یک شاخه به شاخه دیگر از دستور git merge استفاده کنید. اگر میخواهید history شاخهها را حفظ کنید و از commit ادغام اطمینان حاصل کنید، از --no-ff استفاده کنید.
git merge: ادغام شاخه مشخصشده به شاخه جاریgit merge --no-ff: اصرار به ایجاد commit ادغام حتی اگر merge امکانپذیر باشدgit merge --squash: ترکیب کامیتها از شاخه بدون انجام commitgit merge --abort: لغو عملیات merge در صورت بروز تضاد یا وقفه در عملیات
نمای کلی
از git merge برای ادغام تغییرات از یک شاخه به شاخه دیگر استفاده میشود. این دستور به شما کمک میکند تا تاریخچه پروژه خود را مدیریت کرده و تضادها را دستی حل کنید. چه در یک تیم کار کنید یا با شاخههای خود سروکار داشته باشید، git merge ابزار اصلی برای بهروز نگهداشتن مخزن شما است.