«بازگشت» و «رولبک» — اصطلاحاتی به معنای بازگرداندن سیستم، کد یا دادهها به وضعیت قبلی. در توسعه، این یک عملیات اساسی است که در سیستمهای کنترل نسخه، پایگاههای داده و مکانیزمهای استقرار تعبیه شده است. به گفته Git Documentation، عملیات بازگشت میتوانند ایمن (revert با ایجاد commit جدید) و مخرب (reset با از دست دادن تاریخچه) باشند. درک تفاوتهای بین آنها به جلوگیری از از دست دادن دادهها هنگام بازگشت به نسخه قبلی کمک میکند.
نکات اصلی
بازگشت (رولبک) — عملیات بازگرداندن سیستم به وضعیت پایدار قبلی. در زمینه توسعه، این میتواند به معنای لغو commit در Git، بازگرداندن تراکنش در پایگاه داده یا بازگرداندن نسخه قبلی برنامه روی سرور باشد. این اصطلاح از انگلیسی «rollback» گرفته شده و در فرهنگ لغت توسعهدهندگان تمام پلتفرمها تثبیت شده است.
نیاز به بازگشت زمانی ایجاد میشود که تغییر جدید عملکرد را خراب میکند، باعث خطا میشود یا از بررسی کیفیت عبور نمیکند. در یک فرآیند توسعه خوب سازماندهی شده، بازگشت نشانه شکست نیست، بلکه یک رویه استاندارد تعبیه شده در جریان کار است. هرچه تیم سریعتر بتواند یک تغییر مشکلساز را بازگرداند، تاثیر باگ بر کاربران کمتر است.
ابزارهای مختلف مکانیزمهای بازگشت متفاوتی ارائه میدهند: Git بین revert ایمن و reset مخرب انتخاب میدهد، پایگاههای داده از rollback تراکنشی پشتیبانی میکنند و سیستمهای CI/CD میتوانند ترافیک را بین نسخهها جابجا کنند. انتخاب رویکرد به زمینه و الزامات حفظ تاریخچه تغییرات بستگی دارد.
Git revert — روش ایمن بازگشت که یک commit جدید ایجاد میکند و تغییرات قبلی را لغو میکند. تاریخچه خطی باقی میماند، تمام commitهای قدیمی حفظ میشوند. این تنها انتخاب صحیح برای بازگشت در شاخه مشترکی است که چندین توسعهدهنده روی آن کار میکنند. دستور git revert تاریخچه را حذف نمیکند — بلکه واقعیت بازگشت را به عنوان یک تغییر جدید اضافه میکند.
Git reset اشارهگر شاخه فعلی را به یک commit مشخص منتقل میکند و تمام تغییرات بعدی را کنار میگذارد. بسته به پرچم — soft، mixed یا hard — reset دایرکتوری کاری و ایندکس را متفاوت مدیریت میکند. حالت hard تغییرات را به طور کامل از تاریخچه حذف میکند، که آن را برای شاخههای مشترک خطرناک و فقط برای کار محلی مناسب میکند.
Revert در شاخههای اشتراکی استفاده میشود: main، develop، release. تاریخچه را حفظ میکند و به سایر توسعهدهندگان اجازه میدهد بفهمند که یک تغییر لغو شده است. پس از revert میتوان با خیال راحت git pull انجام داد — سیستم تضادهای مربوط به تاریخچه بازنویسی شده را ایجاد نخواهد کرد. در کار تیمی، revert استاندارد پیشفرض است.
# لغو آخرین commit با ایجاد یک commit جدید
git revert HEAD
# لغو یک commit خاص با هش
git revert a1b2c3d
Reset در شاخه محلی که هنوز تغییرات را منتشر نکردهاید مناسب است. اگر آزمایش کردهاید و میخواهید تاریخچه را کاملاً پاک کنید — reset hard این کار را انجام میدهد. در شاخه محلی میتوانید از reset mixed استفاده کنید تا commitها را لغو کنید اما تغییرات را در دایرکتوری کاری برای commit مجدد حفظ کنید.
# لغو آخرین commit، حفظ تغییرات در دایرکتوری کاری
git reset HEAD~1
# لغو کامل — تغییرات به طور دائمی حذف میشوند
git reset --hard HEAD~2
رولبک تراکنش — عملیاتی که تمام تغییرات انجام شده در چارچوب تراکنش جاری را لغو کرده و پایگاه داده را به وضعیت ابتدای آن بازمیگرداند. این اتمیسیته را تضمین میکند — یکی از چهار اصل ACID (Atomicity, Consistency, Isolation, Durability). اگر در هر مرحلهای از تراکنش خطایی رخ دهد، rollback اجرا شده و دادهها به وضعیت اولیه بازمیگردند.
مکانیزم rollback از طریق ثبت پیشنویس (Write-Ahead Log, WAL) پیادهسازی میشود. قبل از تغییر صفحه داده، DBMS مقدار قدیم و جدید را در لاگ ثبت میکند. هنگام rollback، سیستم لاگ را خوانده و مقادیر اصلی را برای تمام صفحات تغییر یافته بازیابی میکند. این تضمین میکند که حتی در صورت قطع برق، تراکنش میتواند به درستی لغو شود.
BEGIN TRANSACTION;
UPDATE accounts
SET balance = balance - 100
WHERE id = 1;
-- Rollback on error
ROLLBACK;
در تراکنشهای طولانی، استفاده از savepoint — نقاط ذخیره میانی که میتوان بدون پایان دادن به کل تراکنش به آنها بازگشت کرد — راحت است. این امکان مدیریت خطاها درون یک عملیات پیچیده را بدون از دست دادن پیشرفت در سایر بخشهای آن فراهم میکند. Savepoint توسط اکثر DBMSهای رابطهای پشتیبانی میشود: PostgreSQL، MySQL، Oracle.
SAVEPOINT sp1;
UPDATE orders SET status = 'cancelled'
WHERE id = 42;
ROLLBACK TO sp1;
بازگشت استقرار — بازگرداندن برنامه در حال اجرا به نسخه قبلی پس از استقرار ناموفق. این یک قابلیت حیاتی برای محیط تولید است: زمان بازیابی (MTTR) مستقیماً بر SLA و تجربه کاربری تأثیر میگذارد. پلتفرمهای مدرن با توجه به معماری و الزامات در دسترس بودن، چندین استراتژی بازگشت ارائه میدهند.
Blue-green — استراتژیای که در آن دو محیط یکسان به طور همزمان کار میکنند: blue (نسخه فعلی) و green (نسخه جدید). ترافیک پس از استقرار موفق به green هدایت میشود. اگر نسخه جدید نادرست کار کند، سوئیچ ترافیک به blue بازمیگردد. بازگشت فوری انجام میشود، بدون نیاز به استقرار مجدد — فقط کافی است مسیریابی را تغییر دهید.
Canary deployment بخش کوچکی از ترافیک را به نسخه جدید هدایت کرده و معیارها را نظارت میکند: تعداد خطاها، زمان پاسخ، درصد درخواستهای موفق. اگر معیارها بدتر شوند، سیستم به طور خودکار canary را بازمیگرداند و تمام ترافیک را به نسخه پایدار هدایت میکند. Kubernetes و service meshها (Istio، Linkerd) از این استراتژی به صورت پیشفرض پشتیبانی میکنند.
apiVersion: apps/v1
kind: Deployment
spec:
replicas: 10
strategy:
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
سه سناریوی معمولی را در نظر میگیریم که در آنها توسعهدهنده باید تغییرات را بازگرداند. هر سناریو رویکرد خود را میطلبد — از یک دستور ساده در ترمینال تا یک رویه چندمرحلهای با مشارکت CI/CD.
شما به طور تصادفی یک commit با باگ به main فرستادهاید. وظیفه شما بازگرداندن تغییرات بدون از دست دادن تاریخچه برای تیم است. از git revert برای ایجاد commit لغوکننده استفاده کنید و سپس git push. تمام اعضای تیم واقعیت بازگشت را خواهند دید و میتوانند بدون تضاد به کار ادامه دهند. این امنترین و شفافترین روش است.
git checkout main
git pull origin main
git revert HEAD
git push origin main
مهاجرت پایگاه داده با خطا به پایان رسید و بخشی از دادهها آسیب دید. از rollback تراکنشی در اسکریپت مهاجرت و بازیابی از پشتیبان برای تغییرات اعمال شده استفاده کنید. در یک سیستم خوب طراحی شده، هر مهاجرت در یک تراکنش پیچیده میشود — در صورت خطا، DBMS به طور خودکار rollback را انجام میدهد.
پس از استقرار نسخه جدید، متوجه شدهاید که احراز هویت کار نمیکند. اگر از blue-green استفاده میکنید، بازگشت به معنای برگرداندن راوتر است. اگر rolling update — دستور kubectl rollout undo نسخه قبلی را بازمیگرداند. در حالت ایدهال، فرآیند بازگشت باید خودکار باشد و بیش از یک دقیقه طول نکشد.
سوالات متداول
Revert یک commit جدید ایجاد میکند که تغییرات را لغو کرده و تاریخچه را حفظ میکند. Reset اشارهگر شاخه را به عقب برده و میتواند commitها را حذف کند. برای شاخههای مشترک فقط از revert استفاده کنید.
اگر commitها توسط زبالهروب Git جمعآوری نشده باشند، میتوان آنها را از طریق git reflog بازیابی کرد. اما پس از پاکسازی، بازیابی غیرممکن میشود. از --hard فقط در شاخههای محلی استفاده کنید.
Rollback تمام تغییرات انجام شده در تراکنش جاری را با استفاده از ثبت پیشنویس (WAL) لغو میکند. DBMS مقادیر اصلی را برای تمام صفحات داده تغییر یافته بازیابی میکند.
Savepoint — یک نقطه ذخیره میانی درون تراکنش است. امکان بازگشت جزئی به آن را بدون لغو کل تراکنش فراهم میکند. در عملیاتهای طولانی با مراحل متعدد مفید است.
Health check و نظارت بر معیارها را پس از استقرار پیکربندی کنید. پس از تجاوز آستانه خطا، بازگشت خودکار را از طریق اسکریپت یا ابزاری مانند Spinnaker، ArgoCD یا GitLab Auto Rollback راهاندازی کنید.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید