“রোলব্যাক” এবং “রিভার্ট” এমন শব্দ যার অর্থ সিস্টেম, কোড বা ডেটাকে পূর্ববর্তী অবস্থায় ফিরিয়ে আনা। ডেভেলপমেন্টে, এটি একটি মৌলিক অপারেশন যা ভার্সন কন্ট্রোল সিস্টেম, ডাটাবেস এবং ডিপ্লয়মেন্ট মেকানিজমের মধ্যে নির্মিত। Git ডকুমেন্টেশন অনুসারে, রোলব্যাক অপারেশন নিরাপদ (নতুন কমিট তৈরি করে রিভার্ট) এবং ধ্বংসাত্মক (ইতিহাস হারিয়ে রিসেট) হতে পারে। পার্থক্যগুলি বোঝা পূর্ববর্তী সংস্করণে ফিরে যাওয়ার সময় ডেটা ক্ষতি এড়াতে সাহায্য করে।
মূল বিষয়
রোলব্যাক — সিস্টেমকে পূর্ববর্তী স্থিতিশীল অবস্থায় ফিরিয়ে আনার অপারেশন। ডেভেলপমেন্টের প্রসঙ্গে, এর অর্থ Git-এ কমিট পূর্বাবস্থায় ফেরানো, ডাটাবেসে লেনদেন রোলব্যাক করা বা সার্ভারে অ্যাপ্লিকেশনের পূর্ববর্তী সংস্করণে ফিরে যাওয়া। শব্দটি ইংরেজি “rollback” থেকে এসেছে এবং সমস্ত প্ল্যাটফর্মের ডেভেলপারদের শব্দভাণ্ডারে দৃঢ়ভাবে প্রতিষ্ঠিত।
রোলব্যাকের প্রয়োজনীয়তা দেখা দেয় যখন একটি নতুন পরিবর্তন কার্যকারিতা ভঙ্গ করে, ত্রুটি সৃষ্টি করে বা গুণগত পরীক্ষায় ব্যর্থ হয়। একটি সুসংগঠিত ডেভেলপমেন্ট প্রক্রিয়ায়, রোলব্যাক ব্যর্থতার চিহ্ন নয়, বরং ওয়ার্কফ্লোতে নির্মিত একটি মানক পদ্ধতি। একটি দল যত দ্রুত সমস্যাযুক্ত পরিবর্তন রোলব্যাক করতে পারে, ব্যবহারকারীদের উপর বাগের প্রভাব তত কম হয়।
বিভিন্ন সরঞ্জাম বিভিন্ন রোলব্যাক প্রক্রিয়া প্রদান করে: Git নিরাপদ revert এবং ধ্বংসাত্মক reset-এর মধ্যে পছন্দ দেয়, ডাটাবেস লেনদেনগত rollback সমর্থন করে, এবং CI/CD সিস্টেম সংস্করণগুলির মধ্যে ট্রাফিক সুইচ করতে পারে। পদ্ধতির পছন্দ প্রসঙ্গ এবং পরিবর্তন ইতিহাস সংরক্ষণের প্রয়োজনীয়তার উপর নির্ভর করে।
Git revert — একটি নিরাপদ রোলব্যাক পদ্ধতি যা পূর্ববর্তী পরিবর্তনগুলি পূর্বাবস্থায় ফেরাতে একটি নতুন কমিট তৈরি করে। ইতিহাস রৈখিক থাকে এবং সমস্ত পুরনো কমিট সংরক্ষিত থাকে। এটি একটি শেয়ার্ড ব্রাঞ্চে রিভার্ট করার একমাত্র সঠিক পছন্দ যেখানে একাধিক ডেভেলপার কাজ করে। Git revert ইতিহাস মুছে ফেলে না — এটি রোলব্যাকের ঘটনাটিকে একটি নতুন পরিবর্তন হিসেবে যুক্ত করে।
Git reset বর্তমান ব্রাঞ্চ পয়েন্টারকে একটি নির্দিষ্ট কমিটে সরিয়ে নেয়, পরবর্তী সমস্ত পরিবর্তন বাতিল করে। ফ্ল্যাগ — soft, mixed বা hard — এর উপর নির্ভর করে, reset ওয়ার্কিং ডিরেক্টরি এবং ইনডেক্স ভিন্নভাবে পরিচালনা করে। hard মোড ইতিহাস থেকে পরিবর্তনগুলি সম্পূর্ণরূপে সরিয়ে দেয়, যা এটিকে শেয়ার্ড ব্রাঞ্চের জন্য বিপজ্জনক এবং শুধুমাত্র স্থানীয় কাজের জন্য উপযুক্ত করে তোলে।
Revert শেয়ার্ড ব্রাঞ্চে ব্যবহৃত হয়: main, develop, release। এটি ইতিহাস সংরক্ষণ করে এবং অন্যান্য ডেভেলপারদের বুঝতে দেয় যে একটি পরিবর্তন পূর্বাবস্থায় ফেরানো হয়েছিল। revert-এর পরে, আপনি নিরাপদে git pull করতে পারেন — সিস্টেম পুনর্লিখিত ইতিহাস সম্পর্কিত দ্বন্দ্ব তৈরি করবে না। দলের কাজে, revert ডিফল্ট মানদণ্ড।
# শেষ কমিট পূর্বাবস্থায় ফেরাতে একটি নতুন কমিট তৈরি করুন
git revert HEAD
# হ্যাশ দ্বারা নির্দিষ্ট কমিট পূর্বাবস্থায় ফেরান
git revert a1b2c3d
Reset একটি স্থানীয় ব্রাঞ্চে উপযুক্ত যেখানে আপনি এখনও পরিবর্তন প্রকাশ করেননি। যদি আপনি পরীক্ষা করছিলেন এবং ইতিহাস সম্পূর্ণ পরিষ্কার করতে চান — reset hard তা করবে। একটি স্থানীয় ব্রাঞ্চে, আপনি reset mixed ব্যবহার করে কমিট পূর্বাবস্থায় ফেরাতে পারেন কিন্তু পুনরায় কমিট করার জন্য ওয়ার্কিং ডিরেক্টরিতে পরিবর্তন রাখতে পারেন।
# শেষ কমিট পূর্বাবস্থায় ফেরান, ওয়ার্কিং ডিরেক্টরিতে পরিবর্তন রাখুন
git reset HEAD~1
# সম্পূর্ণ পূর্বাবস্থা — পরিবর্তনগুলি স্থায়ীভাবে সরানো হয়
git reset --hard HEAD~2
লেনদেন রোলব্যাক — একটি অপারেশন যা বর্তমান লেনদেনের অধীনে করা সমস্ত পরিবর্তন পূর্বাবস্থায় ফেরায় এবং ডাটাবেসকে লেনদেন শুরুর সময়ের অবস্থায় ফিরিয়ে নিয়ে যায়। এটি পারমাণবিকতা নিশ্চিত করে — ACID-এর চারটি নীতির (Atomicity, Consistency, Isolation, Durability) একটি। লেনদেনের যেকোনো পর্যায়ে ত্রুটি ঘটলে, rollback সম্পাদিত হয় এবং ডেটা তার মূল অবস্থায় ফিরে আসে।
রোলব্যাক প্রক্রিয়াটি রাইট-অহেড লগ (WAL)-এর মাধ্যমে বাস্তবায়িত হয়। একটি ডেটা পৃষ্ঠা পরিবর্তন করার আগে, DBMS লগে পুরনো এবং নতুন মান লেখে। রোলব্যাকের সময়, সিস্টেম লগ পড়ে এবং সমস্ত পরিবর্তিত পৃষ্ঠার জন্য মূল মান পুনরুদ্ধার করে। এটি নিশ্চিত করে যে বিদ্যুৎ বিভ্রাটের ক্ষেত্রেও, লেনদেন সঠিকভাবে পূর্বাবস্থায় ফেরানো যেতে পারে।
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 এবং সার্ভিস মেশ (Istio, Linkerd) এই কৌশলটি বিল্ট-ইন সমর্থন করে।
apiVersion: apps/v1
kind: Deployment
spec:
replicas: 10
strategy:
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
আসুন তিনটি সাধারণ পরিস্থিতি বিবেচনা করি যেখানে একজন ডেভেলপারকে পরিবর্তনগুলি রোলব্যাক করতে হয়। প্রতিটি পরিস্থিতিতে নিজস্ব পদ্ধতির প্রয়োজন — টার্মিনালে একটি সাধারণ কমান্ড থেকে শুরু করে CI/CD জড়িত বহু-পদক্ষেপ প্রক্রিয়া পর্যন্ত।
আপনি ভুলবশত main-এ একটি বাগ সহ কমিট পুশ করেছেন। আপনার কাজ হল দলের জন্য ইতিহাস না হারিয়ে পরিবর্তনগুলি রোলব্যাক করা। একটি রিভার্টিং কমিট তৈরি করতে git revert ব্যবহার করুন এবং তারপর git push করুন। দলের সকল সদস্য রোলব্যাক দেখতে পাবেন এবং দ্বন্দ্ব ছাড়াই কাজ চালিয়ে যেতে পারবেন। এটি সবচেয়ে নিরাপদ এবং স্বচ্ছ পদ্ধতি।
git checkout main
git pull origin main
git revert HEAD
git push origin main
একটি ডাটাবেস মাইগ্রেশন ব্যর্থ হয়েছে এবং কিছু ডেটা দূষিত হয়েছে। মাইগ্রেশন স্ক্রিপ্টে লেনদেনগত rollback ব্যবহার করুন এবং ইতিমধ্যে প্রয়োগ করা পরিবর্তনের জন্য ব্যাকআপ থেকে পুনরুদ্ধার করুন। একটি ভালভাবে ডিজাইন করা সিস্টেমে, প্রতিটি মাইগ্রেশন একটি লেনদেনে মোড়ানো থাকে — ত্রুটিতে, DBMS স্বয়ংক্রিয়ভাবে rollback সম্পাদন করে।
নতুন সংস্করণ ডিপ্লয় করার পরে, আপনি আবিষ্কার করেন যে প্রমাণীকরণ কাজ করছে না। যদি আপনি blue-green ব্যবহার করেন, রোলব্যাক হল রাউটারটি পিছনে সুইচ করা। যদি রোলিং আপডেট — kubectl rollout undo কমান্ড পূর্ববর্তী সংস্করণ ফিরিয়ে আনবে। আদর্শভাবে, রোলব্যাক প্রক্রিয়া স্বয়ংক্রিয় হওয়া উচিত এবং এক মিনিটের বেশি সময় নেওয়া উচিত নয়।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
Revert একটি নতুন কমিট তৈরি করে যা পরিবর্তনগুলি পূর্বাবস্থায় ফেরায় এবং ইতিহাস সংরক্ষণ করে। Reset ব্রাঞ্চ পয়েন্টার পিছনে সরিয়ে নেয় এবং কমিট মুছে ফেলতে পারে। শেয়ার্ড ব্রাঞ্চের জন্য, শুধুমাত্র revert ব্যবহার করুন।
যদি কমিটগুলি Git আবর্জনা সংগ্রহ দ্বারা সংগ্রহ না করা হয়, তবে সেগুলি git reflog-এর মাধ্যমে পুনরুদ্ধার করা যেতে পারে। তবে, আবর্জনা সংগ্রহের পরে, পুনরুদ্ধার অসম্ভব হয়ে পড়ে। শুধুমাত্র স্থানীয় ব্রাঞ্চে --hard ব্যবহার করুন।
Rollback রাইট-অহেড লগ (WAL) ব্যবহার করে বর্তমান লেনদেনে করা সমস্ত পরিবর্তন পূর্বাবস্থায় ফেরায়। DBMS সমস্ত পরিবর্তিত ডেটা পৃষ্ঠার জন্য মূল মান পুনরুদ্ধার করে।
Savepoint — একটি লেনদেনের ভিতরে মধ্যবর্তী সংরক্ষণ বিন্দু। এটি সম্পূর্ণ লেনদেন বাতিল না করে আংশিকভাবে ফিরে যাওয়ার অনুমতি দেয়। একাধিক ধাপ সহ দীর্ঘ অপারেশনে উপযোগী।
ডিপ্লয়মেন্টের পরে health check এবং মেট্রিক মনিটরিং সেট আপ করুন। ত্রুটির সীমা অতিক্রম করলে, একটি স্ক্রিপ্ট বা Spinnaker, ArgoCD বা GitLab Auto Rollback-এর মতো সরঞ্জামের মাধ্যমে স্বয়ংক্রিয় রোলব্যাক ট্রিগার করুন।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন