স্ট্যাশিং আপনাকে একটি Git রিপোজিটরিতে আপনার কোড পরবর্তীতে ব্যবহারের জন্য সংরক্ষণ করতে দেয়।
যখন আপনি একটি Git রিপোজিটরির সাথে কাজ করছেন, আপনি একটি ফাইলে পরিবর্তন করতে পারেন যা আপনি পরবর্তীতে একটি Git কমিটে প্রয়োগ করতে চান।
সেখানে git stash কমান্ডটি বড় কাজে লাগে। স্ট্যাশিং আপনাকে আপনার ওয়ার্কিং ব্রাঞ্চের কোড একটি পরবর্তী তারিখের জন্য সংরক্ষণ করতে দেয়। এই টিউটোরিয়ালে, আমরা উদাহরণসহ, Git-এ স্ট্যাশিং-এর বেসিক এবং git stash কমান্ড কীভাবে ব্যবহার করতে হয় তা আলোচনা করব।
Git Stash কী?
স্ট্যাশিং আপনাকে আপনার ওয়ার্কিং ডিরেক্টরি এবং ইনডেক্সের কোড পরবর্তীতে ব্যবহারের জন্য সংরক্ষণ করতে দেয়। কখনও কখনও, কোড লিখার সময়, আপনি আপনার করা পরিবর্তনগুলো সংরক্ষণ করতে চান, কিন্তু সেগুলো রিপোজিটরিতে কমিট করতে চান না।
একটি সিনেরিও যেখানে এটি ঘটতে পারে সেটি হলো ইস্যু ফিক্স করা। ধরা যাক একটি বাগ রিপোর্ট এসেছে। আপনি ইতিমধ্যে একটি ফিচার ইমপ্লিমেন্ট করার কাজ করছেন। আপনি প্রথমে ফিচারের দিকে করা আপনার পরিবর্তনগুলো সংরক্ষণ করতে চাইতে পারেন এবং তারপর বাগ ফিক্স করতে পারেন।
এটি কারণ বাগ রিপোর্টটি সম্ভবত আপনি যে ফিচার ডেভেলপ করছেন সেটির চেয়ে প্রাধান্য পাবে। আপনি প্রথমে বাগ ফিক্স করতে চাবেন, ফিচার-ফোকাসড কোড রিপোজিটরিতে কমিট করার আগে। আপনি আপনার বাগ ফিক্স এবং ফিচার কমিটে একসাথে দেখাতে চাবেন না। এর কারণ হলো বড় এবং জটিল কমিট করা একটি রিপোজিটরির ইতিহাস অন্যান্য ডেভেলপারদের জন্য পড়া কঠিন করে তোলে।
অন্য কথায়, স্ট্যাশিং আপনাকে একটি Git রিপোজিটরিতে অন্য কিছু কাজ করতে দেয় আপনার এক্সিস্টিং কোড ডিসকার্ড বা কমিট না করে।
স্ট্যাশিং আপনাকে আপনার ফাইলে করা পরিবর্তনগুলো সংরক্ষণ, বা "স্ট্যাশ", করতে দেয় পরবর্তীতে। একবার একটি ফাইল স্ট্যাশ হয়ে গেলে, আপনি অন্য কিছুতে কাজ করতে পারেন। তারপর, আপনি পরে ফিরে আসতে পারেন এবং আপনার স্ট্যাশ করা পরিবর্তনগুলো আপনার কোডে প্রয়োগ করতে পারেন।
স্ট্যাশিং বর্তমান ওয়ার্কিং ডিরেক্টরিকে লাস্ট কমিটে রিভার্ট করে। এর মানে স্ট্যাশিং আমাদের কোড আমাদের একটি ক্লিন ওয়ার্কিং ডিরেক্টরি দেয় যেটি আমরা কাজ করতে পারি। একটি ক্লিন ডিরেক্টরি থাকা মানে আমরা মার্জ কনফ্লিক্টের চিন্তা ছাড়া পরিবর্তন করতে পারি। আমাদের কমিটগুলোর মধ্যে পরিবর্তনগুলো সর্ট করার চিন্তা করতেও হয় না।
Git-এ পরিবর্তনগুলো স্ট্যাশ করার পদ্ধতি
git stash কমান্ডটি কোড পরবর্তীতে ব্যবহারের জন্য স্ট্যাশ করতে ব্যবহৃত হয়। যখন আপনি git stash চালাবেন, আপনার বর্তমান ওয়ার্কিং ডিরেক্টরিতে যেসব পরিবর্তন আপনি কমিটে পুশ করেননি সেগুলো পরবর্তীতে ব্যবহারের জন্য সংরক্ষিত হবে। এতে স্টেজড চেঞ্জ (git add ব্যবহার করে স্টেজিং এরিয়াতে যোগ করা পরিবর্তন) এবং আনস্টেজড চেঞ্জ উভয়ই অন্তর্ভুক্ত।
git stash কমান্ডের সিনট্যাক্স:
git stash
ধরা যাক আমরা একটি ওয়েবসাইটে কাজ করছি এবং আমাদের কোড একটি Git রিপোজিটরিতে সংরক্ষিত।
আমরা আমাদের কোডের index.html এবং index.js ফাইলগুলোর পরিবর্তন করেছি। আমরা এই ফাইলগুলো পরবর্তীতে ব্যবহারের জন্য স্ট্যাশ করতে চাই যখন আমরা আমাদের index.html ফাইলে একটি ডিজাইন বাগ ফিক্স করব।
আমাদের পরিবর্তনগুলো দেখতে, আমরা git status কমান্ড ব্যবহার করতে পারি। এটি আমাদের উদাহরণে ফেরত দেয়:
On branch master Your branch is up to date with 'origin/master'. Changes to be committed: new file: index.js Changes not staged for commit: modified: index.html
এটি আমাদের দেখাচ্ছে যে আমরা একটি নতুন ফাইল তৈরি করেছি (index.js), এবং আমরা একটি এক্সিস্টিং ফাইল মডিফাই করেছি (index.html)। আমরা এই পরিবর্তনগুলো পরবর্তীতে ব্যবহারের জন্য সংরক্ষণ করতে চাই যখন আমরা আমাদের কোডবেসের অন্য অংশে কাজ করব। এটি করতে, আমরা git stash কমান্ড ব্যবহার করব:
git stash
আমাদের কোড ফেরত দেয়:
Saved working directory and index state WIP on master: 3b16026 feat: Launch new homepage
git stash কমান্ডটি আমাদের রিপোজিটরিতে করা পরিবর্তনগুলো পরবর্তীতে ব্যবহারের জন্য সংরক্ষণ করেছে। এখন, যদি আমরা আবার git status কমান্ড চালাই, আমরা দেখতে পাব কিছুই কমিট করার জন্য নেই:
On branch master Your branch is up to date with 'origin/master'. nothing to commit, working tree clean
git stash কমান্ডটি আমাদের রিপোজিটরিতে করা পরিবর্তনগুলো পরবর্তীতে ব্যবহারের জন্য সংরক্ষণ করেছে। এখন, যদি আমরা আবার git status কমান্ড চালাই, আমরা দেখতে পাব কিছুই কমিট করার জন্য নেই:
যখন আপনার কোড স্ট্যাশ হয়ে যায়, আপনার রিপোজিটরি আপনার করা পরিবর্তন ছাড়া এর পূর্বের কমিটে রিভার্ট হয়। আপনার কোডে করা পরিবর্তনগুলো পরবর্তীতে ব্যবহারের জন্য সংরক্ষিত হয়েছে। সেগুলো আপনার কোডবেসে প্রয়োগ করা যেতে পারে আপনি রেডি হলে stash pop কমান্ড ব্যবহার করে।
আনট্র্যাকড পরিবর্তন স্ট্যাশ করা
git stash কমান্ড শুধু স্টেজড এবং আনস্টেজড চেঞ্জগুলো স্ট্যাশ করবে যেসব ফাইল ইতিমধ্যে Git রিপোজিটরিতে ট্র্যাক করা হচ্ছে। ডিফল্টভাবে, stash কমান্ড আনট্র্যাকড চেঞ্জগুলো অন্তর্ভুক্ত করে না।
স্টেজড চেঞ্জ হলো যেসব পরিবর্তন স্টেজিং এরিয়াতে যোগ করা হয়েছে। স্ট্যাশ করা আনস্টেজড চেঞ্জ হলো Git দ্বারা ট্র্যাক করা ফাইলগুলোর পরিবর্তন। আপনি একটি নতুন ফাইল পরিবর্তন করেন যা Git দ্বারা ট্র্যাক করা হয় না, সেটি একটি Git stash-এ যোগ হবে না। উপেক্ষা করা ফাইলগুলো একটি stash-এ যোগ হবে না।
এই ডিফল্ট প্রেফারেন্সগুলো git stash কমান্ড ব্যবহার করার সময় প্রয়োগ হয়। আপনি যদি আপনার আনট্র্যাকড ফাইলগুলো স্ট্যাশ করতে চান—যেমন একটি নতুন ফাইল যা স্টেজ করা হয়নি—আপনি -u ফ্ল্যাগ ব্যবহার করতে পারেন। -u ফ্ল্যাগের সিনট্যাক্স:
git stash -u
বিকল্পভাবে, আপনি যদি আপনার উপেক্ষা করা ফাইলগুলো আপনার stash-এ অন্তর্ভুক্ত করতে চান, আপনি -a ফ্ল্যাগ ব্যবহার করতে পারেন। -a ফ্ল্যাগের সিনট্যাক্স:
git stash -a
-a ফ্ল্যাগ ব্যবহার করলে git stash কে বলবে আপনার উপেক্ষা করা ফাইলগুলোর পরিবর্তনগুলো স্ট্যাশ করতে। এগুলো আপনার কোড রিপোজিটরির .gitignore ফাইলে ডিফাইন করা ফাইলগুলো (যদি আপনার কাছে একটা থাকে)।
git stash pop ব্যবহার করে স্ট্যাশ করা পরিবর্তন প্রয়োগ করা
git stash pop কমান্ডটি একটি রিপোজিটরিতে স্ট্যাশ করা পরিবর্তন প্রয়োগ করতে ব্যবহৃত হয়। ধরা যাক আমরা সিদ্ধান্ত নিয়েছি যে আমরা পূর্বের উদাহরণে করা স্ট্যাশ করা পরিবর্তনগুলো প্রয়োগ করতে চাই। আমরা এটি এই কমান্ড দিয়ে করতে পারি:
git stash pop
git stash pop কমান্ড ফেরত দেয়:
On branch master Your branch is up to date with 'origin/master'. Changes to be committed: new file: index.js Changes not staged for commit: modified: index.html Dropped refs/stash@{0} (48afd55381cf43f2332f771349c7233fb99f80a6) git stash pop কমান্ড রান করার ওপর, আমাদের স্ট্যাশ থেকে চেঞ্জগুলো আমাদের রিপোজিটরির লোকাল ওয়ার্কিং কপিতে প্রয়োগ হয়। pop কমান্ড tash-এ থাকা কোড আপনার রিপোজিটরিতে প্রয়োগ করে। তারপর, stash খালি হয়ে যায়।
git stash pop কমান্ড আপনার কোডে করা পরিবর্তনগুলোর একটি তালিকা ও ফেরত দেয়, যা দেখায় আপনার stash-এ কী ছিল।
আপনি git stash apply কমান্ড ব্যবহার করে আপনার কোডে করা পরিবর্তনগুলো প্রয়োগ করতে পারেন। আপনি সেই পরিবর্তনগুলো আপনার stash-এ রাখতে পারেন। আমরা আমাদের stash-এ পরিবর্তনগুলো রাখতে পারি এই কমান্ড ব্যবহার করে:
git stash apply
কমান্ড ফেরত দেয়:
On branch master Your branch is up to date with 'origin/master'. Changes to be committed: new file: index.js Changes not staged for commit: modified: index.html
একাধিক ব্রাঞ্চ জুড়ে পরিবর্তন প্রয়োগ করা
একই স্ট্যাশ করা পরিবর্তনগুলো আপনার কোডবেসের অনেক ব্রাঞ্চে প্রয়োগ করা stash কমান্ডের একটি ভালো ইউজ কেস। উদাহরণস্বরূপ, আপনি সিদ্ধান্ত নিতে পারেন একটি stash একটি ব্রাঞ্চে প্রয়োগ করবেন। তারপর, আপনি অন্য একটি ব্রাঞ্চে মুভ করবেন এবং সেইম stash ব্যবহার করে সংরক্ষিত পরিবর্তনগুলো প্রয়োগ করবেন।
একাধিক Stashes
আপনি Git-এ একাধিক stashes তৈরি করতে পারেন। এর মানে আপনি একটি ফাইলে পরিবর্তন করতে পারেন এবং সেগুলো পরবর্তীতে ব্যবহারের জন্য stash করতে পারেন। আপনি অন্য একটি ফাইলে পরিবর্তন করতে পারেন এবং সেগুলো একটি আলাদা stash-এ সংরক্ষণ করতে পারেন।
Stashes ট্র্যাক করা
একটি রিপোজিটরিতে stashes-এর তালিকা ফেরত পেতে, আপনি নিচের কমান্ডটি চালাতে পারেন:
git stash list
ধরা যাক আমরা আমাদের তৈরি করা সব stashes-এর তালিকা রিট্রিভ করতে চাই। আমরা উপরের কমান্ড এক্সিকিউট করে সেটি করতে পারি। এই কমান্ড ফেরত দেয়:
stash@{0}: WIP on master: 3b16026 feat: Launch new homepage stash@{1}: WIP on master: 3b16026 feat: Launch new homepage git stash list কমান্ড আমাদের stashes-এর তালিকা ফেরত দিয়েছে।
যাইহোক, এই stashes শুধু স্ট্যাশের সাথে অ্যাসোসিয়েটেড ডিফল্ট কমিট মেসেজ ব্যবহার করে। এর মানে আমাদের জন্য ট্র্যাক করা কঠিন যে কোন stash কোন চেঞ্জগুলো অন্তর্ভুক্ত করে। এর কারণ হলো আমরা আমাদের কোনো stash-এ ডেসক্রিপশন স্পেসিফাই করিনি।
ধরা যাক আমরা একটি নতুন stash-এ একটি ডেসক্রিপশন যোগ করতে চাই। আমরা এটি এই কমান্ড দিয়ে করতে পারি:
git stash save "add new change to website"
কমান্ড ফেরত দেয়:
Saved working directory and index state On master: add new change to website
আমাদের লাস্ট কমিটের সাথে অ্যাসোসিয়েটেড ডিফল্ট মেসেজ দেওয়ার বদলে, আমাদের stash-এর নিজস্ব একটি মেসেজ অ্যাসাইন করা হয়েছে।
একাধিক Stashes প্রয়োগ করা
git stash pop কমান্ড সবচেয়ে সাম্প্রতিক stash আপনার রিপোজিটরিতে প্রয়োগ করে (যেটির ট্যাগ stash@{0})। যাইহোক, আপনি একাধিক stashes নিয়ে কাজ করছেন, আপনি একটি নির্দিষ্ট stash আপনার কোডবেসে প্রয়োগ করতে চাইতে পারেন।
আপনি এটি করতে পারেন stash-এ অ্যাসোসিয়েটেড ইউনিক আইডি স্পেসিফাই করে যেটি আপনি আপনার কোডবেসে প্রয়োগ করতে চান। ধরা যাক আমরা stash@{1} এ সংরক্ষিত stash আপনার কোডবেসে প্রয়োগ করতে চাই। আমরা এটি এই কমান্ড দিয়ে করতে পারি:
git stash pop stash@{2} কমান্ড stash@{2}-এ সংরক্ষিত চেঞ্জগুলো আমাদের রিপোজিটরিতে প্রয়োগ করে এবং stashটি ডিলিট করে।
একটি Stash ব্যবহার করে ব্রাঞ্চ তৈরি করা
স্ট্যাশিং আপনার কোডবেসে করা পরিবর্তনগুলো সুবিধাজনকভাবে সংরক্ষণ করার একটি উপায় যখন আপনি অন্য একটি পরিবর্তন করার কাজ করছেন।
যাইহোক, এমন সময় থাকতে পারে যখন, একটি stash মেইনটেইন করার বদলে, আপনি আপনার কোড তার নিজস্ব ব্রাঞ্চে মুভ করতে চান।
এই সিনেরিওটি উত্থান করতে পারে যদি আপনি আপনার কোড মার্জ করার সময় কনফ্লিক্ট আসে। আপনি একটি কোড অন্য ব্রাঞ্চে মুভ করতে চাইতে পারেন যদি আপনি একটি কোডবেসে বড় পরিবর্তন করছেন। সেটাই git stash branch কমান্ড কাজে লাগে।
আপনি git stash branch কমান্ড ব্যবহার করে একটি নতুন ব্রাঞ্চ তৈরি করতে পারেন যেটিতে একটি stash-এর চেঞ্জগুলো প্রয়োগ হবে। এই কমান্ডের সিনট্যাক্স নিম্নরূপ:
git stash branch <new-branch> <stash-id>
"new-branch" প্যারামিটার হলো যে ব্রাঞ্চটি তৈরি করা উচিত সেটির আইডি। "stash-id" হলো সেই stash-এর আইডি যার কোড আপনি নতুন ব্রাঞ্চে প্রয়োগ করতে চান।
ধরা যাক আমরা আমাদের stash@{2} stash থেকে চেঞ্জগুলো "update-site" নামে একটি নতুন ব্রাঞ্চে প্রয়োগ করতে চাই। আমরা এটি এই কমান্ড দিয়ে করতে পারি:
git stash branch update-site stash@{2} কমান্ড ফেরত দেয়:
Switched to a new branch 'update-site' On branch update-site Changes to be committed: new file: index.js Changes not staged for commit: modified: index.html Dropped stash@{2} (9a15b9cd20f8988937134d1267fafbea4c6a8647) প্রথমে, git stash branch কমান্ড আমাদের স্ট্যাশ করা চেঞ্জগুলো জন্য একটি নতুন ব্রাঞ্চ তৈরি করে। আমাদের রিপোজিটরিতে করা পরিবর্তনগুলো নতুন ব্রাঞ্চে প্রয়োগ করা হয়। তারপর, আমরা সেটি ভিউ করার জন্য স্যুইচ করি। শেষে, আমাদের stash ডিলিট হয়ে যায় কারণ স্ট্যাশ করা কোড তার নিজস্ব ব্রাঞ্চে সংরক্ষিত হয়েছে।
একটি Git Stash ডিলিট করা
একবার আপনি একটি stash-এ কোড ব্যবহার করলে, আপনি stashটি ডিলিট করতে git stash drop কমান্ড ব্যবহার করতে পারেন। git stash drop কমান্ডের সিনট্যাক্স:
git stash drop <stash>
ধরা যাক আমরা stash@{2} আইডিтэй stashটি ড্রপ করতে চাই। আমরা এটি এই কমান্ড দিয়ে করতে পারি:
git stash drop stash@{2} কমান্ড ফেরত দেয়:
Dropped stash@{2} (82079798c950b053fac0efb7b1d5693864dc96e7) বিকল্পভাবে, আপনি git stash clear কমান্ড ব্যবহার করে একটি রিপোজিটরির সাথে অ্যাসোসিয়েটেড সব stashes ডিলিট করতে পারেন। এই কমান্ডের সিনট্যাক্স:
git stash clear
এই কমান্ড আমাদের রিপোজিটরিতে সব stashes ডিলিট করে।
নির্দিষ্ট ফাইল স্ট্যাশ করা
git stash কমান্ড ডিফল্টভাবে আপনার বর্তমান ওয়ার্কিং ডিরেক্টরির সব ট্র্যাকড ফাইল স্ট্যাশ করে। যাইহোক, কিছু কেসে, আপনি সিদ্ধান্ত নিতে পারেন আপনি একটি নির্দিষ্ট ফাইল বা ফাইল সেট স্ট্যাশ করতে চান।
আপনি একটি নির্দিষ্ট ফাইল স্ট্যাশ করতে পারেন git stash push কমান্ড ব্যবহার করে। এই কমান্ড ব্যবহার করার সিনট্যাক্স:
git stash push -m "<message>" <file>
"message" প্যারামিটার হলো আপনার stash-এর সাথে অ্যাসোসিয়েটেড যে মেসেজ। "file" প্যারামিটার হলো আপনি যে ফাইলটি স্ট্যাশ করতে চান তার নাম।
ধরা যাক আমরা শুধু আমাদের কোডের index.html ফাইলে করা পরিবর্তনগুলো একটি stash-এ যোগ করতে চাই। আমরা এটি এই কমান্ড দিয়ে করতে পারি:
git stash push -m "feat: changed index.html file" index.html
কমান্ড ফেরত দেয়:
Saved working directory and index state On master: feat: changed index.html file
কমান্ডটি শুধু index.html ফাইলটি একটি stash-এ যোগ করেছে কমিট মেসেজ "feat: changed index.html file" দিয়ে। আমাদের কোডে করা অন্যান্য সব পরিবর্তন যোগ করা হয়নি।
Stashes-এর মধ্যে পার্থক্য দেখানো
যখন আপনি stashes নিয়ে কাজ করছেন, আপনি সম্ভবত আপনার কোডবেসে একাধিক কমিট জুড়ে অনেক ভিন্ন পরিবর্তন করবেন আপনি যে কোডটি stash করেছেন সেটিতে ফিরে যাওয়ার আগে।
উদাহরণস্বরূপ, আপনি আপনার কোড stash করেছেন এবং একটি বাগ ফিক্স করার চলে গেছেন, আপনি বাগ ফিক্স করার জন্য কয়েকটি কমিট পুশ করতে পারেন আপনার stash করা কোডে ফিরে যাওয়ার আগে। এর মানে আপনি আপনার stash এবং আপনার কোডের সবচেয়ে সাম্প্রতিক কমিটের মধ্যে পার্থক্যের একটি সারাংশ দেখতে চাইতে পারেন (যাতে আপনি জানেন আপনি কী পরিবর্তন করেছেন stash করার পর থেকে)।
একটি stash এবং আপনার সবচেয়ে সাম্প্রতিক কমিটের মধ্যে পার্থক্য দেখতে, আপনি git stash show কমান্ড ব্যবহার করতে পারেন। এই কমান্ডের সিনট্যাক্স:
git stash show <stash-id>
"stash-id" প্যারামিটার হলো সেই stash-এর আইডি যার চেঞ্জগুলো আপনি আপনার ব্রাঞ্চের সবচেয়ে সাম্প্রতিক কমিটের সাথে তুলনা করতে চান। ধরা যাক আমরা আমাদের stash@{1} stash-এ কোডটি আমাদের কোডের বর্তমান স্টেটের সাথে তুলনা করতে চাই। আমরা এটি এই কমান্ড দিয়ে করতে পারি:
git stash show stash@{1} কমান্ড ফেরত দেয়:
index.html | 2 +- index.js | 0 2 files changed, 1 insertion(+), 1 deletion(-)
এই আউটপুট আমাদের বলে দেয় যে আমরা আমাদের কোডে দুটি পরিবর্তন করেছি: একটা ইনসারশন এবং একটা ডিলিশন। আপনি যদি আপনার ফাইলগুলোর মধ্যে পার্থক্য দেখতে চান, আপনি -p stash ফ্ল্যাগ ব্যবহার করে সেগুলো দেখতে পারেন। এই ফ্ল্যাগের সিনট্যাক্স নিম্নরূপ:
git stash show -p stash@{1} উপরোক্ত কমান্ড, এক্সিকিউট হলে, ফেরত দেয়:
diff --git a/index.html b/index.html index 4dd1ef7..e859c68 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -