ব্লগে ফিরুন

git stash: একটি ফাইল, বাকি সব অক্ষত

২১ সেপ্টেম্বর, ২০২৬

কোড রিভিউ এসে পড়ল, তিনটি ফাইল অর্ধেকে আটকে আছে, আর নড়তে পারে মাত্র একটি। সব কিছু 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 overwrittenstash-এর পরে পাথ বদলেছেনতুন অবস্থা কমিট বা 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 নিয়ে ফিল্ড নোটস।

পরের হাউ-টু ইমেইলে পান

প্রতি পোস্টে একটি ইমেইল। সমাধান করুন, এগিয়ে যান।

self-hosted · কোনো তৃতীয় পক্ষ নেই · এক ক্লিকে আনসাবস্ক্রাইব

এটা কী?

ফিল্ড নোটস #1: এজেন্ট-চালিত সাইট — মেশিন ডিপ্লয় করে। অনুমোদন আমার।

লেখাগুলো ভালো লাগছে? এমন জিনিস বানানোই আমার পেশা। আমাকে নিন