سرفصل‌های آموزشی
آموزش کاربردی گیت برای برنامه نویسان
تداخل های Git merge

تداخل های Git merge

سیستم های کنترل نسخه، مشارکت بین نویسنده ها (معمولا توسعه دهنده ها) را مدیریت می کنند. گاهی اوقات چند توسعه دهنده ممکن است یک محتوا را ویرایش کنند. اگر توسعه دهنده A کدی که توسعه دهنده B ویرایش می کند را ویرایش کند یک تداخل ممکن است ایجاد شود.  برای کاهش ریسک به وجود آمدن تداخل، توسعه دهنده ها در شاخه های جداگانه کار می کنند. وظیفه اصلی دستور git merge ترکیب شاخه های جدا و حل کردن تداخل های پیش آمده است.

فهمیدن تداخل های ادغام

ادغام کردن و تداخل بخش های پر تکرار در کار با git هستند. تداخل ها در  سایر ابزار های کنترل نسخه می توانند زمان بر و پر هزینه باشند. git، ادغام کردن را بسیار آسان می کند. بیشتر وقت ها git تشخیص می دهد که تغییرات را چگونه یکپارچه کند.

به طور معمول تداخل هنگامی رخ می دهد که دو نفر خط های یکسانی از فایل را تغییر داده باشند. اگر یک توسعه دهنده فایلی را پاک کند در حالی که توسعه دهنده دیگری آن را ویرایش کرده باشد، git نمی تواند به طور خودکار تشخیص دهد کدام یک از آن تغییر ها درست است. تداخل، تنها توسعه دهنده ای که ادغام را انجام می دهد درگیر می کند و بقیه اعضای تیم از وجود تداخل بی خبر اند. Git فایل ای که دچار تداخل شده است را نشانه گذاری و فرآیند ادغام را متوقف می کند. سپس این وظیفه توسعه دهنده است که تداخل را برطرف کند.

انواع تداخل هنگام ادغام

یک ادغام می تواند در دو نقطه وارد حالت تداخل شود. زمانی که ادغام شروع می شود و هنگامی که ادغام در حال انجام است. درباره رسیدگی به هرکدام از این سناریو ها صحبت خواهیم کرد.

Git در شروع ادغام با خطا مواجه می شود

هنگامی که git متوجه شود تغییراتی در مسیر جاری یا ناحیه staging وجود دارد، ادغام دچار خطا می شود. به این دلیل ادغام با خطا مواجه می شود که ممکن است تغییرات فعلی توسط تغییراتی که می خواهند ادغام شوند بازنویسی شود. این اتفاق به دلیل تداخل با تغییرات سایر توسعه دهنده ها نمی افتد بلکه به دلیل وجود تغییرات محلی رخ می دهد. وضعیت تغییرات محلی باید به کمک دستور هایی مانند git stash، git checkout، git commit یا git reset ثبت شوند. خطای ادغام در این سناریو مانند زیر خواهد بود.

error: Entry '<fileName>' not uptodate. Cannot merge. (Changes in working directory)

Git هنگام ادغام کردن دچار خطا می شود

خطا هنگام ادغام کردن به این معنی است که تداخلی بین شاخه فعلی و شاخه ای که دارد ادغام می شود وجود دارد. این نشان دهنده تداخل با کد توسعه دهنده دیگر است. git تمام تلاشش را می کند تا تغییرات را ادغام کند اما رفع تداخل ها را به شما می سپارد. خطای هنگام ادغام مانند زیر است.

error: Entry '<fileName>' would be overwritten by merge. Cannot merge. (Changes in staging area)

 ایجاد تداخل در ادغام

برای این که با تداخل های ادغام بیشتر آشنا شوید در این بخش یک تداخل را شبیه سازی می کنیم تا بعدا آن را بررسی و رفع کنیم. این مثال از خط فرمان لینوکسی استفاده می کند.

$ mkdir git-merge-test
$ cd git-merge-test
$ git init .
$ echo "this is some content to mess with" > merge.txt
$ git add merge.txt
$ git commit -am"we are commiting the inital content"
[main (root-commit) d48e74c] we are commiting the inital content
1 file changed, 1 insertion(+)
create mode 100644 merge.txt

این نمونه کد دنباله ای از دستور ها را اجرا می کند که نتیجه زیر را در بر خواهد داشت:

  • یک مسیر با نام   git-merge-test ایجاد می کنیم و آن را به عنوان یک مخزن جدید به git معرفی می کنیم.
  • یک فایل متنی با نام merge.txt ایجاد کرده و محتوایی در آن قرار می دهیم.
  • merge.text را به مخزن اضافه کرده و آن را commit می کنیم.

اکنون یک مخزن جدید یا شاخه main داریم که دارای فایل merge.txt است. اکنون یک شاخه جدید می سازیم.

$ git checkout -b new_branch_to_merge_later
$ echo "totally different content to merge later" > merge.txt
$ git commit -am"edited the content of merge.txt to cause a conflict"
[new_branch_to_merge_later 6282319] edited the content of merge.txt to cause a conflict
1 file changed, 1 insertion(+), 1 deletion(-)

دستور های اشاره شده کار های زیر را انجام می دهند:

  • ایجاد شاخه new_branch_to_merge_later  و checkout کردن به آن.
  • بازنویسی محتوای .merge.txt
  • Commit کردن محتوای جدید.

با شاخه ی جدید new_branch_to_merge_later ما یک commit ایجاد کرده ایم که محتوای merge.txt را بازنویسی می کند.

git checkout main
Switched to branch 'main'
echo "content to append" >> merge.txt
git commit -am"appended content to merge.txt"
[main 24fbe3c] appended content to merge.tx
1 file changed, 1 insertion(+)

این مجموعه از دستور ها به شاخه checkout، main انجام می دهد. محتوایی را به فایل merge.txt اضافه و آن را commit می کند. اکنون مخزن ما دو commit روی یک فایل دارد که یکی از آن ها در شاخه main و یکی دیگر در شاخه new_branch_to_merge_later است. اکنون دستور git merge new_branch_to_merge_later را اجرا می کنیم تا ببینیم چه اتفاقی می افتد.

$ git merge new_branch_to_merge_later
Auto-merging merge.txt
CONFLICT (content): Merge conflict in merge.txt
Automatic merge failed; fix conflicts and then commit the result.

اکنون یک تداخل بوجود آمد.

چگونه  تداخل های ادغام را تشخیص دهیم

همانطور که در مثال قبلی تجربه کردیم، Git برای تداخل ها یک فرآیند توضیحی ایجاد می کند. ما می توانیم با اجرای دستور git status اطلاعات بیشتری بدست آوریم.

$ git status
On branch main
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)

Unmerged paths:
(use "git add <file>..." to mark resolution)

both modified:   merge.txt

خروجی دستور git status نشان می دهد که به دلیل وجود تداخل، بخش های ادغام نشده وجود دارد. فایل merge.text اکنون در وضعیت تغییر داده شده قرار دارد. بیاید فایل را بررسی کنیم و ببینیم چه چیزی تغییر کرده است.

$ cat merge.txt
<<<<<<< HEAD
this is some content to mess with
content to append
=======
totally different content to merge later
>>>>>>> new_branch_to_merge_later

در این جا از دستور cat استفاده کردیم تا محتوای فایل merge.txt را نمایش دهیم. چند تغییر عجیب دیده می شود.

  • <<<<<<< HEAD
  • =======
  • >>>>>>> new_branch_to_merge_later

این خط های جدید را به عنوان جداکننده های تداخل در نظر بگیرید. کارکتر ======= مرکز تداخل است. تمام محتوای بین مرکز و خط  <<<<<<< HEAD محتوایی است که در شاخه فعلی (main) وجود دارد. همچنین تمام محتوای بین مرکز و >>>>>>> new_branch_to_merge_later محتوایی است که در شاخه ادغام شده وجود دارد.

چگونه تداخل های ادغام را توسط خط فرمان بر طرف کنیم

مستقیم ترین راه موجود برای رفع یک تداخل ویرایش آن فایل است. فایل merge.txt را در ویرایشگر دلخواه باز کنید. برای نمونه بیاید تمام جدا کننده های تداخل را حذف کنیم. فایل ویرایش شده merge.txt در نهایت مانند زیر می شود.

this is some content to mess with
content to append
totally different content to merge later

پس از این که فایل ویرایش شد از دستور git add merge.txt استفاده می کنیم تا محتوای جدید را به ناحیه staging ببریم. برای نهایی کردن ادغام با اجرای دستور زیر یک Commit انجام می دهیم.

git commit -m "merged and resolved the conflict in merge.txt"

git متوجه می شود که تداخل رفع شده است و برای نهایی کردن ادغام یک merge commit ایجاد می کند.

 

دستور های git ای که به رفع تداخل کمک می کنند

ابزار های عمومی

git status

دستور status هنگام کار با git کاربرد زیادی دارد و هنگام ادغام کردن به شناسایی فایل های دارای تداخل کمک زیادی می کند.

git log –merge

دادن ورودی merge– به دستور git log فایل log ای شامل commit هایی که بین شاخه ها تداخل ایجاد کرده است را در اختیار ما قرار می دهد.

git diff

Diff در پیدا کردن تفاوت بین وضعیت های مختلف یک مخزن کاربرد دارد. از این دستور می توان برای پیش بینی و جلوگیری از تداخل کمک گرفت.

ابزارهایی برای زمانی که git از شروع ادغام جلوگیری می کند

git checkout

از checkout برای برگرداندن تغییر فایل یا تعویض شاخه ها استفاده می شود.

git reset –mixed

reset برای برگرداندن تغییرات مسیر جاری و ناحیه staging استفاده می شود.

ابزار هایی برای زمانی که git هنگام ادغام دچار تداخل می شود

git merge –abort

اجرای دستور git merge با ورودی abort– باعث می شود از فرآیند ادغام خارج شوید و به وضعیت ای که شاخه فعلی قبل از ادغام داشت برگردید.

git reset

git reset می تواند هنگام تداخل استفاده شود تا فایل های دارای تداخل را به وضعیت خوبی که قبلا داشتند برگرداند.

خلاصه

تداخل هنگام ادغام می تواند تجربه ترسناکی باشد. خوشبختانه git ابزارهای قدرتمندی برای مرور و رفع تداخل ها در اختیار ما قرار می دهد. git می تواند بیشتر ادغام ها را به خودی خود انجام دهد. یک تداخل وقتی به وجود می آید که دو شاخه جداگانه فایلی را ویرایش کردند یا یکی از آن ها فایل را پاک کرده و دیگری آن را تغییر داده است. به طور معمول تداخل هنگامی رخ می دهد که در یک تیم کار می کنیم.

ابزار های زیادی برای رفع تداخل وجود دارد. Git تعداد زیادی از ابزار های ویژه خط فرمان دارد که در این مطلب به آن ها اشاره کردیم. برای مطالعه بیشتر درمورد هر کدام از آن ها به بخش اختصاصی git log، git reset، git checkout و git status مراجعه کنید.

علاوه بر Git تعداد زیادی از ابزار های Third party  قابلیت رفع ساده تداخل های ادغام را به کاربرانشان پیشنهاد می دهند.

online-support-icon