আপনি যদি আপনার ম্যাক-এর কোনো গিট প্রজেক্টে একটি ফাইল স্টেজ করে থাকেন কিন্তু পরবর্তী কমিটে সেটি রাখতে না চান, তবে টার্মিনাল থেকে সেই ফাইলটির জন্য git restore --staged চালান। এটি আপনার ওয়ার্কিং ফোল্ডারে ফাইলটি অক্ষত রেখেই গিট-এর স্টেজিং এরিয়া আপডেট করে, ফলে এর পরিবর্তনগুলো পরে পর্যালোচনা বা স্টেজ করার জন্য উপলব্ধ থাকে। কমিট করার আগে ফাইলের পাথ যাচাই করুন এবং git status দিয়ে ফলাফল নিশ্চিত করুন।
“আনস্টেজ” যা পরিবর্তন করে
গিট পরবর্তী প্রস্তাবিত কমিটটি তার ইনডেক্সে রাখে, যাকে স্টেজিং এরিয়াও বলা হয়। একটি কমিটে সাধারণত স্টেজ করা পরিবর্তনগুলো অন্তর্ভুক্ত থাকে; যে পরিবর্তনগুলো আপনি স্টেজ করেননি সেগুলো আপনার ওয়ার্কিং ট্রিতে থেকে যায়। তাই ইনডেক্স থেকে কোনো ফাইল সরিয়ে নিলে তা ওয়ার্কিং কপি পুনর্লিখন না করেই কমিটের জন্য প্রস্তুত করা অংশে পরিবর্তন আনে। গিট-এর বিবরণ অনুযায়ী git restore --staged ডিফল্টভাবে HEAD থেকে ইনডেক্স পুনরুদ্ধার করে। গিট-এর restore ডকুমেন্টেশন
আপনি ভুল ফাইল স্টেজ করে ফেললে, বা কোনো একটি ফাইল কমিট থেকে বাদ রাখার সিদ্ধান্ত নিলে এটি অত্যন্ত কার্যকর। আপনি যখন একটি পাথ উল্লেখ করেন, তখন কমান্ডটি শুধুমাত্র সেই ফাইলের ক্ষেত্রেই প্রযোজ্য হয়। এর সাথে --worktree যোগ করবেন না: গিট-এর ডকুমেন্টেশনে বলা হয়েছে যে --staged এবং --worktree উভয়ই ব্যবহার করলে তা উভয় স্থান থেকেই পুনরুদ্ধার করে, যা আপনার পরিবর্তনগুলো ধরে রাখার উদ্দেশ্যের বিপরীত।
টার্মিনাল থেকে একটি ফাইল আনস্টেজ করুন
আপনার ম্যাক-এ টার্মিনাল খুলুন এবং রিপোজিটরি ফোল্ডারে যান। টার্মিনালের ডিফল্ট শেল হলো zsh, তবে কোনো পরিচালিত (managed) ম্যাক-এ ভিন্ন শেল ব্যবহৃত হতে পারে। অ্যাপলের টার্মিনাল গাইড
প্রথমে git status চালান। “Changes to be committed”-এর নিচে স্টেজ করা ফাইলটি খুঁজুন এবং রিপোজিটরি রুট অনুযায়ী এর পাথটি লক্ষ্য করুন। আপনি যদি অন্য কোনো রিপোজিটরি দেখতে পান বা পাথটি অস্পষ্ট মনে হয়, তবে কোনো কিছু পরিবর্তন করার আগে থামুন এবং আপনার অবস্থান যাচাই করুন।
উদাহরণস্বরূপ, src/Feature.swift আনস্টেজ করতে চালান:
git restore --staged -- src/Feature.swift
এখানে -- অপশনগুলোকে পাথ থেকে আলাদা করে। যেসব নামের কারণে বিভ্রান্তি তৈরি হয়ে সেগুলোকে অপশন হিসেবে বিবেচনা করা হতে পারে, সেগুলোর ক্ষেত্রে এটি সহায়ক। স্পেসযুক্ত পাথগুলোকে উদ্ধৃতি চিহ্নের (quote) মধ্যে রাখুন যাতে zsh পুরো পাথটিকে একটি আর্গুমেন্ট হিসেবে গ্রহণ করে:
git restore --staged -- "Documentation/Setup Notes.md"
বড় বা ছোট হাতের অক্ষর এবং যেকোনো ডিরেক্টরির নামসহ গিট যেভাবে প্রদর্শন করে, ঠিক সেভাবেই পাথটি ব্যবহার করুন। আপনি যদি ইতোমধ্যেই রিপোজিটরির কোনো সাবডিরেক্টরিতে অবস্থান করেন, তবে গিট-এর পাথ পরিচালনা কিছুটা জটিল হতে পারে; তাই রিপোজিটরি রুট থেকে কমান্ড চালানো এবং সম্পূর্ণ রিপোজিটরি-সম্পর্কিত পাথ ব্যবহার করা লক্ষ্যবস্তু যাচাই করা সহজ করে তোলে।
পরিবর্তনগুলো এখনো আছে কিনা তা নিশ্চিত করুন
আবার git status চালান। কোনো ট্র্যাক করা, পরিবর্তিত ফাইলের ক্ষেত্রে স্টেজ করা পরিবর্তনটি “Changes to be committed” থেকে মুছে যাবে এবং “Changes not staged for commit”-এর নিচে প্রদর্শিত হবে। এর অর্থ হলো ওয়ার্কিং কপিটি এখনও HEAD-এর চেয়ে আলাদা, তবে ইনডেক্সে আর সেই প্রস্তাবিত পরিবর্তনটি নেই। গিট স্ট্যাটাসকে HEAD এবং ইনডেক্সের মধ্যকার, এবং ইনডেক্স ও ওয়ার্কিং ট্রির মধ্যকার পরিবর্তন হিসেবে বর্ণনা করে। গিট-এর add ডকুমেন্টেশন
আপনি নিচের কমান্ডের মাধ্যমে আনস্টেজ করা পরিবর্তনগুলো দেখতে পারেন:
git diff -- "src/Feature.swift"
এই ডিফারেন্সটি (diff) ওয়ার্কিং ফাইলের সাথে ইনডেক্সের তুলনা করে। যেহেতু সেই ট্র্যাক করা ফাইলের জন্য ইনডেক্সটি এখন HEAD-এর সাথে মিলে গেছে, তাই এটি আপনার সংরক্ষিত পরিবর্তনগুলো প্রদর্শন করে যা আপনি স্টেজিং থেকে সরিয়ে নিয়েছেন। ফাইলটিকে পরবর্তী কোনো কমিটের জন্য প্রস্তুত করতে, git add -- "src/Feature.swift" দিয়ে এটি পুনরায় স্টেজ করুন।
নতুন ফাইল এবং ফাইল মুছে ফেলার ক্ষেত্রে কী প্রত্যাশা করবেন
ফাইলটি যদি নতুন হয় এবং কখনো কমিট করা না হয়ে থাকে, তবে HEAD-এ এর কোনো সংস্করণ থাকে না। git restore --staged -- path/to/new-file চালানোর মাধ্যমে এটি ইনডেক্স থেকে সরিয়ে ফেলার পর, ফাইলটি ডিস্কে একটি আনট্র্যাকড ফাইল হিসেবে থেকে যাওয়া উচিত। git status-এ এটি “Untracked files”-এর অধীনে প্রদর্শিত হচ্ছে কিনা তা পরীক্ষা করুন; আপনি যদি এটি রাখতে চান তবে এটি মুছে ফেলবেন না।
আপনি যদি কোনো ট্র্যাক করা ফাইল মুছে ফেলার বিষয়টি স্টেজ করে থাকেন, তবে HEAD থেকে ইনডেক্স পুনরুদ্ধার করলে ট্র্যাক করা সংস্করণটি পুনরায় ইনডেক্সে ফিরে আসে, যদিও ওয়ার্কিং কপিটি মুছে ফেলা অবস্থাতেই থাকে। স্ট্যাটাসে এটি একটি আনস্টেজড ডিলিশন (unstaged deletion) হিসেবে দেখানো উচিত। এই পার্থক্যটি অত্যন্ত গুরুত্বপূর্ণ: আনস্টেজ করার অর্থ এই নয় যে ওয়ার্কিং ট্রি অপরিবর্তিত দেখাবে; এটি ডিস্কে বর্তমানে বিদ্যমান অবস্থাকেই সংরক্ষণ করে।
আপনি যদি ফাইলের কেবল কিছু অংশ স্টেজ করে থাকেন
এই একই কমান্ড ফাইলের স্টেজ করা সমস্ত বিষয়বস্তু সম্পূর্ণভাবে আনস্টেজ করে দেয়। আপনি যদি ইচ্ছাকৃতভাবে কিছু অংশ (hunks) স্টেজ করে থাকেন এবং কেবল নির্দিষ্ট কিছু অংশ স্টেজড অবস্থায় রাখতে চান, তবে পুরো ফাইলের কমান্ডটি চালাবেন না। গিট-এর restore কমান্ড ইন্টারঅ্যাক্টিভ প্যাচ মোড সমর্থন করে, তবে সঠিক দিক এবং অংশ নির্বাচন করার জন্য সতর্কতার প্রয়োজন। এটি ব্যবহারের আগে গিট-এর ডকুমেন্টেড git restore --patch আচরণ পর্যালোচনা করুন; স্টেজ করার অংশগুলো ইন্টারঅ্যাক্টিভভাবে বেছে নেওয়ার জন্য গিট git add --patch-এর নথিপত্রও প্রদান করে। গিট-এর restore ডকুমেন্টেশন
এই কাজের জন্য git restore --worktree বা git restore --staged --worktree এড়িয়ে চলুন। এই অপশনগুলো ওয়ার্কিং ট্রির উপর প্রভাব ফেলে এবং আপনি যে পরিবর্তনগুলো রাখতে চাইছেন সেগুলোই মুছে ফেলতে পারে। git status-এর ফলাফল যদি আপনার প্রত্যাশার চেয়ে ভিন্ন হয়, তবে অন্য কোনো রিস্টোর কমান্ড চালানোর আগে থামুন এবং পাথ ও ডিফারেন্স (diff) ভালোভাবে পরীক্ষা করুন।
উৎসসমূহ
Change the default shell in Terminal on Mac — Apple Support