Git কিছু undo করার বেশ কয়েকটা distinct উপায় দেয় — সঠিকটা বেছে নেওয়া নির্ভর করে ঠিক কী undo করা দরকার তার উপর, আর এটা ইতিমধ্যে অন্য কারো সাথে শেয়ার হয়েছে কিনা।
# একটা file-এর পরিবর্তন বাতিল করুন, শেষ commit-এ ফিরে
git checkout -- index.html
# বা, নতুন সমতুল্য:
git restore index.htmlএটা irreversible
এটা স্থায়ীভাবে uncommitted পরিবর্তন বাতিল করে — এখানে একটা undo-র জন্য কোনো undo নেই। ঠিক কী হারানো যাবে তা দেখতে আগে git diff দুবার check করার যোগ্য।
# একটা staged file আবার শুধু "modified"-এ ফিরিয়ে নিন — পরিবর্তনটা নিজে রাখা হয়
git restore --staged index.htmlবর্তমান branch pointer-কে পেছনে সরায়, এর সাথে কতটা undo হয় তার তিনটা level সহ।
| Reset ধরন | পরিবর্তনগুলোর কী হয় |
|---|---|
| git reset --soft HEAD~1 | শেষ commit undo হয়, কিন্তু এর পরিবর্তন staged থেকে যায় |
| git reset --mixed HEAD~1 (default) | শেষ commit undo হয়, পরিবর্তন working folder-এ থাকে কিন্তু unstaged |
| git reset --hard HEAD~1 | শেষ commit আর এর পরিবর্তন দুটোই সম্পূর্ণভাবে চলে যায় |
এই lesson-এর সবচেয়ে বিপজ্জনক command
git reset --hard সাধারণ উপায়ে কোনো recovery ছাড়াই কাজ বাতিল করে। নিশ্চিত না হয়ে কখনো এটা চালাবেন না — আর কখনো এমন একটা commit-এ না যা ইতিমধ্যে push হয়ে অন্যদের সাথে শেয়ার হয়েছে, নিচে কভার করা।
History থেকে একটা commit মুছে ফেলার বদলে, revert একটা একদম নতুন commit তৈরি করে যা এর পরিবর্তন undo করে — আসল commit history-তে থাকে, যা ঠিক দরকার একবার একটা commit ইতিমধ্যে push হয়ে গেলে আর অন্যদের কাছে থাকলে।
git revert a1b2c3d
# commit a1b2c3d-এর পরিবর্তন undo করে একটা নতুন commit তৈরি করে| পরিস্থিতি | ব্যবহার করুন |
|---|---|
| একটা uncommitted পরিবর্তন, এখনো staged না | git restore |
| locally করা একটা commit, কখনো push বা শেয়ার হয়নি | git reset |
| ইতিমধ্যে push হওয়া আর হয়তো অন্যদের সাথে শেয়ার হওয়া একটা commit | git revert — কখনো একটা shared commit reset করবেন না |