تعارض ادغام (Merge Conflicts) و حل آن
تعارض در ادغام چیست، چرا اتفاق میافتد و چطور مثل یک حرفهای آن را حل کنید — قدمبهقدم.
تعارض چیست؟
گاهی هنگام merge، گیت نمیداند چطور دو شاخه را ترکیب کند: وقتی هر دو شاخه یک بخش از یک فایل را به شکل متفاوت تغییر دادهاند. به این وضعیت تعارض (Conflict) میگویند.
تعارض یک خطا نیست — یک وضعیت طبیعی کار تیمی است! هر برنامهنویسی با آن سروکار دارد. مهم این است که بدانید چطور حلش کنید.
ساخت یک تعارض (آزمایشگاهی!)
بیایید عمداً یک تعارض بسازیم تا یاد بگیریم:
# ۱. روی main خط اول فایل hello.txt را تغییر دهید:
git switch main
echo "سلام از main" > hello.txt
git add . && git commit -m "تغییر از main"
# ۲. در شاخه دیگر همان خط را متفاوت تغییر دهید:
git switch -c feature-x
echo "سلام از feature" > hello.txt
git add . && git commit -m "تغییر از feature"
# ۳. برگردید به main و merge کنید:
git switch main
git merge feature-x
نتیجه — تعارض!
CONFLICT (add/add): Merge conflict in hello.txt
Automatic merge failed; fix conflicts and then commit the result.
وضعیت هنگام تعارض
git status
# On branch main
# You have unmerged paths.
# (fix conflicts and run "git commit")
#
# Unmerged paths:
# (use "git add <file>..." to mark resolution)
# both modified: hello.txt
نشانههای تعارض در فایل
اگر فایل hello.txt را باز کنید، این را میبینید:
<<<<<<< HEAD
سلام از main
=======
سلام از feature
>>>>>>> feature-x
| نشانه | معنی |
|---|---|
<<<<<<< HEAD | شروع بخش تعارض — محتوای شاخه فعلی (main) |
======= | جداکننده دو نسخه |
>>>>>>> feature-x | پایان بخش — محتوای شاخه در حال ادغام |
حل تعارض در ۴ قدم
- فایل را باز کنید و بخش تعارض را پیدا کنید (نشانههای
<<<<<<<) - تصمیم بگیرید: کدام نسخه درست است؟ یا ترکیبی از هر دو؟ محتوای نهایی را بنویسید و همه نشانهها را حذف کنید
- فایل را stage کنید:
git add hello.txt - کامیت کنید:
git commit(پیام پیشفرض merge آماده است)
مثلاً محتوای نهایی حلشده:
سلام از main و feature (ترکیب هر دو)
ابزارهای کمکی حل تعارض
- VS Code: وقتی فایل تعارضدار را باز کنید، دکمههای
Accept Current/Accept Incoming/Accept Bothنشان میدهد — فوقالعاده! - دیدن هر دو نسخه:
git diffدر حالت تعارض، هر دو نسخه را کنار هم نشان میدهد - خروج از merge: اگر پشیمان شدید:
git merge --abort— همهچیز به قبل از merge برمیگردد
ترفندهای پیشگیری از تعارض
- شاخههای کوچک و کوتاهعمر بسازید — هرچه شاخه عمر کندتر داشته باشد، احتمال تعارض بیشتر میشود
- مرتب از main بگیرید:
git merge mainداخل شاخه قابلیت، آن را بهروز نگه میدارد - با تیم هماهنگ باشید — دو نفر روی یک فایل همزمان کار نکنند
- کامیتهای کوچک: تغییرات کوچک، تعارضهای کوچکتر و سادهتر
خلاصه
- تعارض = هر دو شاخه یک بخش را متفاوت تغییر دادهاند
- نشانهها:
<<<<<<<و=======و>>>>>>> - حل: محتوای نهایی را بنویسید، نشانهها را حذف کنید، add و commit
git merge --abortبرای فرار از merge- شاخههای کوچک = تعارض کمتر
این مبحث بخشی از دوره آموزش کامل Git است.