به راهنمای نهایی ما برای دستورات git merge و git rebase خوش آمدید. این آموزش هر آنچه را که باید در مورد ترکیب چند شاخه با Git بدانید را به شما آموزش میدهد.
GIT MERGE
دستور git merge هر تغییری را که در پایه کد در یک شاخه جداگانه ایجاد شده است را به شاخه فعلی شما به عنوان یک commit جدید ادغام میکند.
دستور به صورت زیر است:
git merge BRANCH-NAME
برای مثال، اگر درحال حاضر در شعبه ای به نام dev کار میکنید و میخواهید تغییرات جدیدی که در شعبه ای به نام new features ایجاد شده است را ادغام کنید، دستور زیر را میزنید:
git merge new-features
اگر تغییرات غیر متعهد در شاخه فعلی شما وجود داشته باشد، Git به شما اجازه ادغام نمیدهد تا زمانی که همه تغییرات در شاخه فعلی شما انجام شود. برای مدیریت این تغییرات، میتوانید یکی از موارد زیر را انجام دهید:
یک شاخه ایجاد کنید و تغییرات را انجام دهید.
git checkout -b new-branch-name
git add .
git commit -m "<your commit message>"
آنها را مخفی کنید
git stash # add them to the stash
git merge new_features # do your merge
git stash pop # get the changes back into your working tree
تمام تغییرات را رها کنید
git reset --hard # remove all pending changes
Git Rebase
تغیر پایه یک شاخه در Git راهی برای انتقال کل یک شاخه به نقطه دیگری از درخت است. ساده ترین مثال حرکت دادن شاخه ای به سمت بالا در درخت است. فرض کنید ما یک شاخه داریم که در نقطه A از شاخه اصلی جدا شده است:
/o-----o---o--o-----o--------- branch
--o-o--A--o---o---o---o----o--o-o-o--- master
وقتی Rebase میکنید، میتوانید آن را به این شکل حرکت دهید:
/o-----o---o--o-----o------ branch
--o-o--A--o---o---o---o----o--o-o-o master
o rebase، مطمئن شوید که تمام تعهدات مورد نظر خود را در rebase در شاخه اصلی خود دارید. شاخه ای را که میخواهید rebase کنید بررسی کنید و git rebase master را تایپ کنید (جایی که master شاخه ای است که میخواهید روی آن rebase کنید).
همچنین میتوان بر روی یک شاخه دیگر مجددا پایه گذاری کرد، به طوری که به عنوان مثال شاخه ای که بر اساس شاخه دیگری است(بیایید آن را ویژگی بنامیم ) بر اساس اصلی است:
/---o-o breanch
/---o-o-o-o---o--o------ feature
----o--o-o-A----o---o--o-o-o--o--o- master
پس از git rebase ,master branch یا git rebase master هنگامی که شاخه را بررسی کردید، دریافت خواهید کرد:
/---o-o-o-o---o--o------ fature
---o--o-o-A----o-o-A----o---o--o-o-o--o--o- masrer
/---o-o breanch
تعاملی در کنسول Git rebase
برای استفاده از git rebase در کنسول با لیستی از commit ها، میتوانید rebase را انتخاب، ویرایش یا رها کنید:
- 5~git rebase -iHEAD را وارد کنید و آخرین عدد هر تعداد commit از آخرین نسخه هایی است که میخواهید بررسی کنید.
- در
vim، esc-و سپس i را فشار دهید تا ویرایش تست شروع شود.
در سمت چپ میتوانید انتخاب را با یکی از دستورات نویسی کنید. اگر میخواهید یک cpmmit را به یک قبلی تبدیل کنید و پیام commit را کنار بگذارید، f را در محل انتخاب commit وارد کنید.
- ویرایشگر متن خود را ذخیره کرده و از آن خارج شوید.
- وقتی rebase متوقف شد، تنظیمات لازم را انجام دهید، سپس از git rebase استفاده کنید __ تا زمانی که rebase موفقت آمیز باشد، ادامه دهید
- اگر با موفقیت تغییر مجدد کرد،باید تغییرات خود را با git push -f فشار دهید تا نسخه بازسازی شده را به مخزن راه دور خود اضافه کنید.
- اگر تضاد ادغام وجود داشته باشد، چند راه برای رفع آن وجود دارد. یک راه این است که فایل ها را در یک ویرایشگر متن باز کنید و قسمت هایی از کد را که نمیخواهید حذف کنید. سپس از git add>file name< و سپس __ git rebase continue استفاده کنید. میتوانید با وارد کردن git rebase--skip و متوقف کردن rebase با اجرای git rebase--abort در کنسول خود، از commit دارای تضاد عبور کنید.
pick 452b159 <message for this commit>
pick 7fd4192 <message for this commit>
pick c1af3e5 <message for this commit>
pick 5f5e8de <message for this commit>
pick 5186a9f <message for this commit>
# rebase 0617e63..5186a9f onto 0617e63 (30 commands)
#
# commands:
# p, pick = use commit
# r, reword = use commit, but stop to edit the commit message.
# e, edit = use commit, but stop to amend or add commit.
# s, squash = use commit, meld into previous commit and stop to edit the commit message.
# f, fixup = like "squash", but discard this commit's log message thus dosen't stop.
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# these lines can be re-ordered; they are executed from top to bottom.
#
# if you remove a line here THAT COMMIT WILL BE LOST.
#
# however, if you remove everything, the rebase will be aborted.
#
# note that empty commits are commented out
ادغام تضاد ها
تضاد ادغام زمانی است که شما تعهداتی را در شاخه های جداگانه انجام دهید کههمان خط را به روش های متضاد تغییر میدهند. اکر این اتفاق بیفتد،Git نمیداند کدام نسخه از فایل را در یک پیغام خطای مشابه زیر نگه دارد:
CONFLICT (content): Merge conflict in resume.txt Automatic merge failed; fix conflicts and then commit the result.
اگر به فایل resume.txt در ویرایشگر کد خود نگاه کنید، میتوانید محل تضاد را ببینید:
<<<<<<<HEAD
Adress: 808 South street
=======
Adress: 505 North Street
>>>>>>> upated_address
Git چند خط اضافی به فایل اضافه کرد:
- HEAD >>>>>>>
- =======
- - updated_address <<<<<<<
======= را به عنوان خط جداکننده درگیری در نظر بگیرید. همه چیز بین HEAD <<<<<<< و ======= محتوای شاخه فعلی است که مرجع HEAD به ان اشاره میکند. از طرف دیگر، همه چیز بین======= و updated_address >>>>>>> محتوای شعبه در حال ادغام، updated_address است.
Git Merge در مقابل Git Rebase
هر دو git merge و git rebase دستورات بسیار مهمی هستند و یکی بهتر از دیگری نیست. با این حال، تفاوت های بسیار مهمی بین این دو دستور وجود دارد که شما تیم تان باید در نظر بگیرید.
هر زمانی که git merge اجرا شود، یک commit اضافی ایجاد میشود. هر زمان که در مخزن محلی خود کار میکنید، داشتن تعداد زیاد commit های ادغام میتواند تاریخچه commit را گیج کننده به نظر برساند. یکی از راه های جلوگیری از ادغام commit استفاده از git rebase به جای ان است.
git rebase یک ویژگی بسیار قدرتمند است. همانطور که گفته شد، اگر به روش صحیح استفاده نشود، خطرناک است.
git rebase تاریخچه commit را تغییر میدهد، بنابراین با احتیاط از آن استفاده کنید. اگر Rebasing در مخزن راه دور انجام شود، زمانی که توسعه دهندگان دیگر سعی میکنند آخرین تغییرات کد را از مخزن راه دور خارج کنند، میتواند مشکلات زیادی ایجاد کند. به یاد داشته باشید که git rebase را فقط در یک مخزن محلی ایجاد کنید.
این تمام چیزی است که برای ادغام و تغییر با بهترین آنها باید بدانید.
