উত্তর:
কারণ এর কোনও মানে নেই (অন্যান্য কমান্ডগুলি ইতিমধ্যে সেই কার্যকারিতা সরবরাহ করে) এবং এটি দুর্ঘটনাক্রমে ভুল কাজ করার সম্ভাবনা হ্রাস করে।
একটি পাথের জন্য "হার্ড রিসেট" সবেমাত্র git checkout HEAD -- <path>(ফাইলটির বিদ্যমান সংস্করণটি পরীক্ষা করে) দিয়ে সম্পন্ন করা হয়।
কোনও পাথের জন্য একটি নরম পুনরায় সেট করার কোনও অর্থ হয় না।
কোনও পথের জন্য একটি মিশ্র পুনরায় সেট করা যা git reset -- <path>করে।
git checkout -- <path>একটি হার্ড রিসেট না; এটি মঞ্চযুক্ত বিষয়বস্তুগুলির সাথে কাজের গাছের সামগ্রীর পরিবর্তে। git checkout HEAD -- <path>কোনও পাথের জন্য হার্ড রিসেট করে, সূচক এবং কার্যকরী গাছ উভয়কেইএইএডিড কমিটের সংস্করণ দিয়ে প্রতিস্থাপন করে।
reset --hardএকটি পথ দিয়ে এই অনুপস্থিত টুকরা সরবরাহ করবে। গিট ইতিমধ্যে এত শক্তিশালী যে "আমরা আপনার নিজের সুরক্ষার জন্য আপনাকে এটি করতে দিই না" অজুহাত শূন্য জল ধারণ করে: "দুর্ঘটনাক্রমে" ভুল কাজ করার প্রচুর উপায় রয়েছে। আপনার যখন যেভাবেই হোক না কেন এটি গুরুত্বপূর্ণ নয় git reflog।
git reset --hard -- <path>। এটির জন্য বৈধ ব্যবহারের মামলা রয়েছে।
আপনি যা ব্যবহার করে চেষ্টা করছেন তা অর্জন করতে পারেন git checkout HEAD <path>।
এটি বলেছিল, প্রদত্ত ত্রুটি বার্তাটি আমার কাছে কোনও ধারণা রাখে না (যেমন git resetসাব-ডাইরেক্টরিগুলিতে ঠিক সূক্ষ্ম কাজ করে), এবং আমি git reset --hardএটি জিজ্ঞাসা করছি ঠিক কী করা উচিত হবে না তার কোনও কারণ আমি দেখতে পাচ্ছি না ।
ইতিমধ্যে যেভাবে উত্তর দেওয়া হয়েছে প্রশ্নটি , আমি কেন সেই অংশটি ব্যাখ্যা করব ।
তো, গিট রিসেট কী করবে? নির্দিষ্ট পরামিতিগুলির উপর নির্ভর করে, এটি দুটি পৃথক কাজ করতে পারে:
আপনি যদি কোনও পথ নির্দিষ্ট করে থাকেন তবে এটি সূচকের সাথে মিলে যাওয়া ফাইলগুলি প্রতিশ্রুতি (ডিফল্টরূপে হেড) থেকে ফাইলগুলির সাথে প্রতিস্থাপন করে। এই ক্রিয়াটি কার্যত গাছকে মোটেই প্রভাবিত করে না এবং সাধারণত গিট অ্যাডের বিপরীতে হিসাবে ব্যবহৃত হয়।
আপনি যদি কোনও পথ নির্দিষ্ট না করেন তবে এটি বর্তমান শাখার প্রধানকে একটি নির্দিষ্ট প্রতিশ্রুতিতে সরিয়ে দেয় এবং তার সাথে একত্রে সূচক এবং কার্যনির্বাহী গাছটিকে সেই প্রতিশ্রুতিবদ্ধ অবস্থার সাথে পুনরায় সেট করে। এই অতিরিক্ত আচরণটি মোড প্যারামিটার দ্বারা নিয়ন্ত্রিত হয়: -
সাফ্ট : সূচক এবং কার্যক্ষম গাছটিকে স্পর্শ করবেন না।
--মিক্সড (ডিফল্ট): সূচকটি পুনরায় সেট করুন তবে কার্যক্ষম গাছ নয়।
--হার্ড : সূচি এবং কার্যকারী গাছটি পুনরায় সেট করুন।
এছাড়াও অন্যান্য বিকল্প রয়েছে, সম্পূর্ণ তালিকা এবং কিছু ব্যবহারের ক্ষেত্রে ডকুমেন্টেশন দেখুন।
যখন আপনি কোন প্রতিশ্রুতি নির্দিষ্ট করেন না, এটি git reset --softহেডের ডিফল্ট হয়, তাই কিছুই করবে না, কারণ এটি হেডকে হেড করার (এটির বর্তমান অবস্থানে) আদেশ হ'ল। git reset --hardঅন্যদিকে, এর পার্শ্ব প্রতিক্রিয়াগুলির কারণে তা বোঝা যায় , এটি বলছে যে মাথাটি হেডের দিকে সরান এবং সূচি এবং কার্যকারী গাছটিকে হেডে পুনরায় সেট করুন।
আমি মনে করি এখনই এটি স্পষ্ট হওয়া উচিত যে কেন এই অপারেশনটি নির্দিষ্ট ফাইলগুলির প্রকৃতির দ্বারা নয় - এটি প্রথমে একটি শাখা প্রধানকে স্থানান্তরিত করার উদ্দেশ্যে কাজ করে, কার্যকরী গাছটিকে পুনরায় সেট করা এবং সূচকটি গৌণ কার্যকারিতা।
git checkoutকমান্ড হিসাবে ইতিমধ্যে উপলব্ধ ? এবং একই জিনিসটি পুনরায় সেট করা ব্যবহারকারীদের আরও বিভ্রান্ত করবে। আমার উত্তর ছিল যে --hardবিকল্পটি নির্দিষ্ট ফাইলগুলিতে প্রযোজ্য নয় কারণ এটি শাখা পুনরায় সেট করার জন্য একটি মোড, সূচি পুনরায় সেট করার জন্য নয়। এবং ট্রি ট্রি রিসেটের নাম দেওয়া হয়েছে চেকআউট, কারণ আপনি অন্যান্য উত্তরে পড়তে পারেন। এগুলি সবই গিটের ইউজার ইন্টারফেস, আইএমএইচওর একটি খারাপ নকশা।
git checkout: git reset --কেবল সূচক সেট করে, যখন git checkout --কেবলমাত্র কার্যক্ষম গাছ সেট করে?
নিশ্চিত করুন যে আপনি উত্স বা উজানের (উত্স) এবং প্রকৃত শাখার মধ্যে স্ল্যাশ রেখেছেন:
git reset --hard origin/branch
অথবা
git reset --hard upstream/branch`
আছে: পেছনে একটি খুব গুরুত্বপূর্ণ কারণ নীতির checkoutএবংreset ।
গিটের ভাষায়, চেকআউটটির অর্থ "বর্তমানের কার্যক্ষম গাছটিতে নিয়ে আসা"। এবং এর সাহায্যে git checkoutআমরা কোনও অঞ্চল থেকে ডেটা দিয়ে কার্যকারী গাছটি পূরণ করতে পারি , এটি কোনও প্রতিশ্রুতি থেকে প্রতিশ্রুতিবদ্ধ হতে বা কোনও প্রতিশ্রুতি বা স্টেজিং অঞ্চল থেকে পৃথক ফাইল (যা এমনকি পূর্বনির্ধারিত)।
ঘুরেফিরে, গিট রিসেটের এই ভূমিকা নেই। নাম সুপারিশ, এটি সাম্প্রতিক সুত্র পুনরায় সেট করবে কিন্তু সবসময় থাকার সংগ্রহস্থলের "নাগালের" স্বাধীনভাবে, একটি উৎস হিসেবে (--soft, --mixed বা --hard)।
সংক্ষিপ্তবৃত্তি:
সুতরাং কিছুটা বিভ্রান্তিকর কারণটি হ'ল git reset COMMIT -- filesযেহেতু "ওভাররাইটিং হেড" কেবলমাত্র কিছু ফাইলই বোঝায় না!
অফিসিয়াল ব্যাখ্যার অনুপস্থিতিতে, আমি কেবল অনুমান করতে পারি যে গিট বিকাশকারীরা resetমঞ্চ অঞ্চলে করা পরিবর্তনগুলি বাতিল করার জন্য এখনও একটি আদেশের সেরা নাম এবং কেবলমাত্র তথ্য উত্সের সন্ধানের সংগ্রহস্থল ছিল, তবে " আসুন আমরা প্রসারিত করি নতুন কমান্ড তৈরির পরিবর্তে কার্যকারিতা "।
সুতরাং কোনওভাবে git reset -- <files>ইতিমধ্যে কিছু ব্যতিক্রমী: এটি হেডকে ওভাররাইট করবে না। আইএমএইচও এই সমস্ত প্রকারের ব্যতিক্রম হবে। এমনকি যদি আমরা কোনও --hardসংস্করণটি ধারণ করতে পারি তবে অন্যরা (উদাহরণস্বরূপ --soft) তা বোঝায় না।
git reset -- <files>এটি যুক্ত হওয়ার মতো পড়ে গিয়েছিল কারণ এটি দরকারী বৈশিষ্ট্য তবে এটি কোন আদেশে রাখা উচিত তা কেউ নিশ্চিত করে না। ভাগ্যক্রমে এখন আমাদের অনেক বেশি বুদ্ধিমান রয়েছে git restoreযার কার্যকারিতা রয়েছে git checkout -- <path> git checkout <commit> -- <path>এবং git reset [<commit>] -- <path>অনেক স্যানার ডিফল্ট এবং এমন আরও অনেকগুলি বৈশিষ্ট্য যা আপনি আগে করতে পারেননি (স্বীকৃত উত্তর যা বলে তার বিপরীতে আপনি অবশেষে সহজেই কেবল কাজ করার গাছটিকে পুনরুদ্ধার করতে পারেন সূচকটি স্পর্শ না করে)।
git resetম্যানুয়াল তালিকা আবাহন এর 3 টি উপায়:
2 ফাইল-ভিত্তিক: এগুলি কার্যকরী গাছকে প্রভাবিত করে না , তবে কেবলমাত্র সূচকগুলিতে উল্লিখিত ফাইলগুলিতে কাজ করে <paths>:
git reset [-q] [<tree-ish>] [--] <paths>..git reset (--patch | -p) [<tree-ish>] [--] [<paths>...]1 প্রতিশ্রুতিবদ্ধ-ভিত্তিক: রেফারেন্সযুক্ত সমস্ত ফাইলে পরিচালনা করে <commit>এবং কার্যকারী গাছকে প্রভাবিত করতে পারে:
git reset [<mode>] [<commit>]সেখানে যে শুধুমাত্র নির্দিষ্ট ফাইল পরিচালনা আবাহন কোন মোড এবং কাজ গাছ প্রভাবিত করে।
যদি আপনি উভয় করতে চান:
আপনি আপনার গিট কনফিগারেশন ফাইলটিতে এই উপনামটি ব্যবহার করতে পারেন:
[alias]
reco = !"cd \"${GIT_PREFIX:-.}\" && git reset \"$@\" && git checkout \"$@\" && git status --short #" # Avoid: "fatal: Cannot do hard reset with paths."
তারপরে আপনি এর মধ্যে একটি করতে পারেন:
$ git reco <paths>
$ git reco <branch/commit> <paths>
$ git reco -- <paths>
(জন্য Mnenonic reco: reসেট && cনরক oহিসাবে)
git checkout -- <path>হবে প্রতিস্থাপিত সঙ্গেgit reset --hard <path>। এটি আরও অনেক কিছু বোঝায় ...