CodeShot
Midسختی 4 از ۵· در 74٪ مصاحبه‌های این حوزه پرسیده شده

تفاوت `git merge` و `git rebase` چیست و کدام را باید استفاده کرد؟

نشان کردن

پاسخ کوتاه

`merge` یک Commit ادغام جدید می‌سازد و تاریخچه هر دو Branch را حفظ می‌کند؛ `rebase` Commitهای یک Branch را روی نوک Branch دیگر بازپخش می‌کند و یک تاریخچه خطی می‌سازد.

پاسخ کامل

فرض کنید Branch feature از main جدا شده و هر دو Commitهای جدید گرفته‌اند.

  • git merge main (داخل feature): یک Commit جدید به نام «Merge Commit» می‌سازد که دو والد دارد؛ تاریخچه واقعی (که کِی از کجا جدا شد) کامل حفظ می‌شود اما گراف پیچیده‌تر می‌شود.
  • git rebase main (داخل feature): Commitهای feature را یکی‌یکی برمی‌دارد و انگار از نوک فعلی main دوباره نوشته، پشت سر هم می‌چیند — تاریخچه خطی و تمیز می‌شود، اما Commitهای اصلی عملاً بازنویسی (Hash جدید) می‌شوند.

قاعده طلایی: هرگز روی Branchی که دیگران هم روی آن کار می‌کنند و آن را Pull کرده‌اند Rebase نکنید — چون Hash Commitها عوض می‌شود و تاریخچه بقیه با شما ناسازگار می‌شود.

مثال کد

# merge — امن برای Branchهای مشترک
git checkout feature
git merge main

# rebase — برای تمیزکردن تاریخچه یک Branch شخصی قبل از Pull Request
git checkout feature
git rebase main

نکته مهم

منبع کامل موضوع: Git Branching - Rebasing — Pro Git Book.

اشتباه رایج

❌ اجرای git rebase روی یک Branch مشترک که همکاران دیگر هم از آن Pull کرده‌اند — باعث تداخل تاریخچه برای کل تیم می‌شود.

شرکت‌هایی که این سؤال را پرسیده‌اند

اسنپ