بسم الله الرحمن الرحیم
با استفاده از git rebase میتوانید مسیج یک commit را تغییر دهید و یا دو commit مختلف را با هم یکی کنید و یا اینکه ترتیب قرار commit ها را عوض کنید.مثلا یک commit را با دیگری جابجا کنید. و حتی میتوانید محتوی یک commit را به صورت کلی تغییر دهید .برای درک بهتر به مثال های زیر توجه کنید.
ریپازتوری که برای مثال استفاده میکنم به شکل زیر است . پنج commit دارد که میخواهیم git rebase را روی آنها تمرین کنیم.
برای شروع باید از دستور زیر استفاده کنید.
git rebase --interactive HEAD~4
عددی که بعد از HEAD می آید باید حداقل یک عدد کمتر از تعداد commit های شما باشد مثلا در اینجا ما از 4 استفاده کردیم زیرا تعداد commit های ما 5 عدد است.
دستور بالا در یک ترمینال تکست ادیتور ,چیزی شبیه فایل زیر باز میکند که شما با تغییر متن این فایل تغییراتی در commit ها و تاریخچه آنها ایجاد می کنید.
در این مثال ما میخواهیم "fourth commit add newfile" را قبل از "second commit قرار دهیم" برای این کار باید این فایل متنی را به ترتیب زیر تغییر دهیم و خارج شویم.
pick 8363f75 fourth commit add newfile pick 6ba07f0 second commit pick 2c0568b third commit pick c311512 fifth commit
وقتی پیام "Successfully rebased and updated refs/heads/master." را دریافت کردیم,یعنی اینکه عملیات با موفقیت انجام شد و شکل ریپازتوری ما به شکل زیر تغییر کرد و "fourth commit add newfile" به رده دوم انتقال پیدا کرده است.
حالا میخواهیم "fourth commit add newfile" را تغییر نام بدهیم و مسیج آن را به "my custom message" تغییر دهیم.
برای اینکار دوباره از دستور "git rebase --interactive HEAD~4
" استفاده می کنیم .
در این فایل مانند تصویر زیر دستور پشت "fourth commit add newfile" را که دستورpick است را به reword تغییر دهید و فایل را سیو کنید و خارج شوید.
بعد از سیو و خروج از فایل بالا یک فایل دیگر مانند تصویر زیر باز می شود که در آنجا می توانید message جدید برای commit خود انتخاب کنید .کافی است بجای "fourth commit add newfile" پیام جدید خود را بنویسید که من قصد دارم این متن را "my custom message" جایگزین قبلی کنم.
سپس فایل را ذخیره و خارج شوید.
بعد از از انجام عملیات بالا ریپازتوری ما به شکل زیر تغییر می کند.
اگر بخواهیم به یک commit قدیمی برگردیم مثلا "my custom message" و تغییراتی در آنجا انجام بدهیم و دوباره به HEAD که در مثال ما "fifth commit" است برگردیم و کار را ادامه دهیم باید از دستور edit در git rebase استفاده کنیم.
دوباره از دستور "git rebase --interactive HEAD~4
" استفاده می کنیم تا فایل rebase باز شود و در پشت "my custom message" دستور edit را می نویسیم.
بعد از اجرای این دستور باید بروید و تغییراتی که میخواهید را اعمال کنید .مثلا من در فایل newfile.md یک خط جدید اضافه می کنم.
بعد از اعمال تغییرات برای ذخیره باید این تغییر را ابتدا با استفاده از دستور زیر اضافه کنید.
git add .
سپس با دستور زیر ان را commit کنید .
git commit --amend
سپس برای اینکه از rebase خارج شوید دسور زیر را اجرا کنید. البته بعضی مواقع به بعد از commit به صورت خودکار از rebase خارج می شود .
git rebase --continue
در این مرحله می خواهیم "second commit" را با "third commit" یکی کنیم. برای اینکار دوباره با استفاده از "git rebase --interactive HEAD~4
" فایل rebase را باز می کنیم .
پشت "third commit" از دستور squash استفاده می کنیم. این دستور به بالای سر خود نگاه می کند و اگر commit با دستور pick وجود داشت آن را با خودش یکی می کند . در تصویر زیر می بیند که بالا "third commit" دقیقا "second commit" با دستور pick قرار دارد پس این دو بعد از ذخیره این فایل باید یکی بشوند.
بعد از ذخیره فایل بالا یک فایل جدید مانند تصویر زیر باز می شود که به شما می گویید پیام message ترکیب این دو commit باید چه باشد . شما میتوانید پیام دلخواه خود را بنویسید یا بدون انجام تغییر این فایل را ذخیره کنید.
بعد از ذخیره فایل بالا این دو commit با هم یکی میشود و شکل ریپازتوری ما به شکل زیر تغییر می کند.
دستور fixup مانند squash است با این تفاوت که دیگر از شما نمیخواهد که message را مشخص کنید. این دستور به صورت خودکار message کامییت بالایی را انتخاب می کند.
برای اینکار ابتدا دستور "git rebase --interactive HEAD~3
" را اجرا می کنیم . توجه داشته باشید که عدد بعد از HEAD را به 3 تغییر دادم زیرا در مرحله قبل یکی از تعداد commit ها کم شد .
دستور fix up کامییت "second commit" را با commit بالایی خود که دستور pick دارد یعنی "my custom message" ترکیب می کند و از پیام commitبالایی استفاده می کند.
بعد از اجرای دستور بالا شکل ریپازتوری ما به شکل زیر تغییر می کند.
در این مطلب سعی کردم تمام دستورات git rebase را(pick ,squash ,fixup ,reword ,edit) را با مثال توضیح بدهم که امیدوارم برای شما مفید بوده باشد.