কোড রিভিউ এসে পড়ল, তিনটি ফাইল অর্ধেকে আটকে আছে, আর নড়তে পারে মাত্র একটি। সব কিছু stash করে বাকি দুটি ফাইল আবার টাইপ করা — এমন অনুষ্ঠানের কেউ কষ্টে মনে করে না।
TL;DR: git stash push -m "কারণ" -- <path> ঠিক উল্লিখিত পাথগুলোই stash করে এবং আপনার নোংরা ট্রির বাকি অংশ শান্তিতে রাখে। পরিবর্তন ফিরিয়ে আনুন git stash pop দিয়ে (অথবা যেকোনো stash থেকে একটি ফাইল আলাদা করে git restore --source stash@{0} -- <path> দিয়ে টানুন)। pathspec রূপটি git 2.13-এ এসেছে, মে ২০১৭-তে ছাড়া — গত আট বছরের যেকোনো টুলচেনেই আছে।
git stash push -m "app.conf prod tweak" -- app.conf
git stash list
# stash@{0}: On main: app.conf prod tweak
git stash pop ট্রি নয়, ফাইল stash করুন।
git-এ কীভাবে শুধু একটি ফাইল stash করব?
খালি git stash গোটা ওয়ার্কিং ট্রি ঝেড়ে ফেলে — প্রতিটি ট্র্যাক-করা পরিবর্তন stash-এ চলে যায়, সবকিছু HEAD-এ ফিরে যায়। নোংরা ট্রি যখন মিশ্র, তখন এ ভুল আকার: একটি ফাইল বুঝিয়ে দেওয়ার মতো তৈরি, বাকিগুলো সত্যি অসম্পূর্ণ। উত্তর হলো pathspec-সহ push, git-stash ডকুমেন্টেশন অনুযায়ী:
# আগে: তিনটি নোংরা ফাইল
$ git status --short
M app.conf
M notes.md
M main.py
# শুধু app.conf stash করুন
$ git stash push -m "app.conf prod tweak" -- app.conf
Saved working directory and index state On main: app.conf prod tweak
$ git status --short
M notes.md
M main.py app.conf কমিট করা অবস্থায় ফিরে এলো এবং গিয়ে বসল stash@{0}-এ; notes.md আর main.py নড়লই না। -m বার্তা ঐচ্ছিক, কিন্তু git stash list-এ দ্বিতীয় এন্ট্রি দেখা মাত্র ওই তিন সেকেন্ডের মূল্য ওঠে — “WIP” নামের stash-এর বয়স কষ্টে ধরা পড়ে।
দুটি কাজের খুঁটিনাটি:
- pathspec
---এর পরে আসে। দুটো ড্যাশের পরের সবকিছুই পাথ, ফ্ল্যাগ নয়।git checkout -- <path>-এর সেই একই রীতি, আর এটা অলংকার নয়: পুরনো সংস্করণেgit stash push -- main.pyআরgit stash push main.pyআলাদা আচরণ করত — নাঙা পাথ ভুল পড়া যেত। - ট্র্যাক-হীন ফাইলের জন্য
-uলাগে। একদম নতুন ফাইলের কাছে stash-যোগ্য কোনো ট্র্যাক-করা ইতিহাস নেই, তাই সাধারণpushতাকে ফেলে দেয়।git stash push -u -- newfile.pyতাকে নেয়;-aআরও এক ধাপ গিয়ে ignored ফাইলও ঝেড়ে ফেলে।
একটি ফাইলের কিছু অংশ কীভাবে stash করব?
নিজে ফাইলই যদি অর্ধেক হয় — ভালো তিনটি hunk, লজ্জাজনক একটি — ইন্টারঅ্যাকটিভ ফ্লো সেটি কেটে দেয়:
git stash -p # অথবা: git stash push -p Git প্রতিটি hunk ঘুরে জিজ্ঞেস করে Stash this hunk [y,n,q,a,d,j,g,/,e,p,?]?। stash-এ যাওয়া hunk-এ y, থেকে যাওয়ায় n চাপুন। ফল: শুধু মঞ্জুর-করা অংশের stash, আর ফাইলের বাকিটা ট্রিতে নোংরাই থেকে যায়। সেই একই hunk-পরম্পরা মেশিনারি git add -p-কেও চালায়, তাই প্রতিফ্লেক্স সরাসরি বদলে যায়।
git stash push -- <path> | git stash -p | |
|---|---|---|
| দানা | গোটা ফাইল | একক hunk |
| গতি | এক কমান্ড, স্ক্রিপ্টযোগ্য | ইন্টারঅ্যাকটিভ, hunk-পরম্পরা |
| CI-তে পুনরাবৃত্তি | হ্যাঁ (পাথ আর্গুমেন্টে) | না — প্রম্পটে মানুষ চাই |
| সবচেয়ে ভালো | “এই ফাইল, বাকিটা নয়” | “এই পরিবর্তন, ওটা নয়” |
| থেকে | git 2.13 (মে ২০১৭) | বহুকাল ধরেই |
ডকুমেন্টেশনের নিজস্ব মডেল থেকে হাতে-কলমের নিয়ম: সীমানা যদি ফাইল হয় pathspec, ফাইলের ভেতরে হলে -p।
stash-করা ফাইল ফিরিয়ে কীভাবে আনব?
git stash pop stash@{0} পুনরুদ্ধার করে এবং এন্ট্রি মুছে দেয়। স্বাভাবিক পথ — কিন্তু pop প্রতি stash-এ সব-অথবা-কিছুই-নয়, আর কনফ্লিক্টে pop থেমে যায়, এন্ট্রি বেঁচে থাকে। দুটি সূক্ষ্মতর পথ:
# ১. না মুছে প্রয়োগ করুন (নিরাপদে পুনরাবৃত্তি করা যায়)
git stash apply stash@{0}
# ২. stash থেকে একটি ফাইল বের করুন, এন্ট্রি দাঁড়িয়ে থাকুক
git restore --source stash@{0} -- app.conf
# একই কাজের 2.23-এর আগের লেখা:
git checkout stash@{0} -- app.conf restore/checkout রূপটি উত্তর দেয় “তিনটি পরিবর্তন একসঙ্গে stash করেছিলাম, এখন দরকার একটিই” — সেই পাথের stash-করা বিষয়বস্তু ওয়ার্কিং ট্রিতে কপি করে, stash@{0} দাঁড়িয়ে থাকে। খেয়াল রাখুন: এটি ওয়ার্কিং ট্রির কপিটিকে ওভাররাইট করে; সেই পাথের বর্তমান সম্পাদনা যদি দামি হয়, আগে diff নিন:
git diff stash@{0} -- app.conf stash reflog-সদৃশ স্তূপে সত্যিকারের কমিট হয়ে সংরক্ষিত থাকে — এ জন্যই stash@{0} যেকোনো commit-ish সিনট্যাক্স নেয়, আর ভুলে ফেলে রাখা stash-ও পরবর্তী গার্বেজ কালেকশন পর্যন্ত reflog থেকে ফেরানো যায়।
stash কখন ভুল যন্ত্র?
stash খসড়ার কাগজ, ব্রাঞ্চ নয়: git branch-এ কোনো নাম নেই, রিভিউ নেই, ডিফল্টে দেখানো diff নেই, আর এন্ট্রি নিঃশব্দে জমতে জমতে বিস্মৃত হয়। চলমান কাজ যদি মেশিন বা দিনের প্রেক্ষাপট-পরিবর্তন টেনে নিতে হয়, তবে ব্রাঞ্চে কমিট করুন — সঙ্গে-লাগানো ইতিহাস বেনাম স্তূপের চেয়ে ভালো। ওই পার্ক-করা কমিটগুলো পরে অন্যত্র নামাতে হলে git cherry-pick বয়ে আনে। আর উদ্দেশ্য পার্ক করা নয়, বাতিল করা হলে সর্বশেষ কমিট বাতিল-এর সিদ্ধান্ত-বৃক্ষ চলে।
ডকুমেন্ট-করা আচরণ থেকে তোলা সৎ ত্রুটি-খাতা:
| লক্ষণ | কারণ | সমাধান |
|---|---|---|
| stash-এর পরে ফাইল নেই | untracked পাথ এড়িয়ে যায় | git stash push -u -- <path> |
pop-এ error: Your local changes ... would be overwritten | stash-এর পরে পাথ বদলেছে | নতুন অবস্থা কমিট বা stash করুন, তারপর pop |
| তোলা পরিবর্তন হাওয়া | pop কনফ্লিক্টে থেমেছিল | মেটান, তারপর git stash apply |
| “কোন stash-টা ছিল?” | বেনামি stash-এর স্তূপ | প্রতিবার -m বার্তা |
git stash push-এ pathspec জুড়ে দেওয়া মে ২০১৭-র রিলিজ-নোট আজ আট বছরের, আর git stash-এর পেশি-স্মৃতির বেশিরভাগ তারও বয়স্ক। একবার নতুন করে শেখা মূল্যবান: আজ গোটা ট্রি ঝাড়াই-ই বিশেষ কেস, ডিফল্ট নয়।
FAQ
git-এ কীভাবে শুধু একটি ফাইল stash করব?
git stash push -m "নোট" -- path/to/file — pathspec রূপ শুধু নাম-উল্লেখিত পাথ stash করে এবং বাকি নোংরা ফাইলগুলো অস্পৃশ্য রাখে। git 2.13 বা তার নতুন লাগবে (মে ২০১৭)।
একটি stash থেকে কীভাবে একটি ফাইল আলাদা করে বের করব?
git restore --source stash@{0} -- path/to/file (অথবা পুরনো রূপ git checkout stash@{0} -- path/to/file)। stash এন্ট্রি না মুছেই stash করা সংস্করণটি আপনার ওয়ার্কিং ট্রিতে কপি হয়।
git stash আমার নতুন ফাইল কেন এড়িয়ে যায়?
ট্র্যাক-হীন (untracked) ফাইল সাধারণ stash-এর অংশ নয়। -u যোগ করুন: git stash push -u -- path/to/file। ignored ফাইলের জন্য -a লাগবে।
— mrsaynothing
— mrsaynothing
AI, Linux ও self-hosting নিয়ে ফিল্ড নোটস।
পরের হাউ-টু ইমেইলে পান
প্রতি পোস্টে একটি ইমেইল। সমাধান করুন, এগিয়ে যান।
এটা কী?ফিল্ড নোটস #1: এজেন্ট-চালিত সাইট — মেশিন ডিপ্লয় করে। অনুমোদন আমার।
লেখাগুলো ভালো লাগছে? এমন জিনিস বানানোই আমার পেশা। আমাকে নিন