"গিট আরএম - ক্যাচড এক্স" বনাম "গিট রিসেট হেড - এক্স"?


163

GitRef.org - বেসিক :

git rmমঞ্চ অঞ্চল থেকে এন্ট্রি সরিয়ে ফেলবে। এটি কিছুটা আলাদা git reset HEADযা থেকে "আনস্টেজগুলি" ফাইল। "আনস্টেজ" দ্বারা আমি বোঝাতে চাইছি এটি জিনিসগুলি সংশোধন করার আগে এটি মঞ্চ অঞ্চলটিকে যা ছিল সেখানে ফিরিয়ে দেয়। git rmঅন্যদিকে কেবল ফাইলটিকে পুরোপুরি স্টেজ থেকে সরিয়ে দেয়, যাতে এটি পরবর্তী কমিট স্ন্যাপশটের অন্তর্ভুক্ত না হয়, যার ফলে কার্যকরভাবে মুছে ফেলা হয়।

ডিফল্টরূপে, একটি git rm fileপুরোপুরি স্টেজিং অঞ্চল থেকে ফাইলটি সরিয়ে ফেলবে এবং আপনার ডিস্ক> (কার্যক্ষম ডিরেক্টরি) বন্ধ করে দেবে। কার্যকারী ডিরেক্টরিতে ফাইলটি ছেড়ে দিতে, আপনি ব্যবহার করতে পারেন git rm --cached

কিন্তু কি ঠিক মধ্যে পার্থক্য git rm --cached asdএবং git reset head -- asd?

উত্তর:


219

তিনটি জায়গা রয়েছে যেখানে একটি ফাইল বলা যেতে পারে - গাছ, সূচক এবং কার্যকরী অনুলিপি। আপনি যখন কোনও ফোল্ডারে সবেমাত্র একটি ফাইল যুক্ত করবেন, আপনি এটিকে ওয়ার্কিং কপির সাথে যুক্ত করছেন।

আপনি যখন এমন কিছু করেন যখন আপনি git add fileএটি সূচকে যুক্ত করেন। এবং আপনি যখন এটি প্রতিশ্রুতিবদ্ধ করেন, আপনি এটি গাছটিতেও যুক্ত করেন।

এটি সম্ভবত গিট রিসেটে আরও তিনটি সাধারণ পতাকা জানতে আপনাকে সহায়তা করবে:

গিট রিসেট [- <mode>] [ <commit>]

এই ফর্মটি বর্তমান শাখার প্রধানকে পুনরায় সেট করে <commit>এবং সম্ভবত সূচকটি (এটি গাছের সাথে পুনরায় সেট করা <commit>) এবং কার্যকারী গাছের উপর নির্ভর করে আপডেট করে <mode>, যা নিম্নলিখিতগুলির মধ্যে একটি হতে হবে: -
সাফ্ট

সূচি ফাইল বা কার্যকারী গাছকে মোটেই স্পর্শ করে না (তবে <commit>সমস্ত মোডের মতোই মাথাটি পুনরায় সেট করে )। এটি আপনার সমস্ত পরিবর্তিত ফাইলগুলিকে "প্রতিশ্রুতিবদ্ধ হতে পরিবর্তনগুলি" ছেড়ে দেয়, যেমন গিট স্ট্যাটাসটি এতে রাখে।

--mixed

সূচী পুনরায় সেট করে তবে কার্যনির্বাহী গাছ নয় (অর্থাত্ পরিবর্তিত ফাইলগুলি সংরক্ষিত থাকলেও প্রতিশ্রুতিবদ্ধ হিসাবে চিহ্নিত করা হয় না) এবং আপডেট করা হয়নি বলে প্রতিবেদন করে। এটি ডিফল্ট কর্ম হয়।

--hard

সূচক এবং কার্যক্ষম গাছ পুনরায় সেট করে। কার্যক্ষেত্রের ট্র্যাক করা ফাইলগুলিতে যে কোনও পরিবর্তন <commit>বাতিল করা হয়েছে।

এখন, যখন আপনি যেমন কিছু করেন git reset HEAD- আপনি আসলে যা করছেন তা হ'ল git reset HEAD --mixedএটি সূচকে "পুনরায় সেট" করে দেবে আপনি সূচিগুলিতে ফাইলগুলি যুক্ত করতে / পরিবর্তনগুলি যুক্ত করা শুরু করার আগে (এর মাধ্যমে git add) এই ক্ষেত্রে, ওয়ার্কিং অনুলিপি এবং সূচক (বা স্টেজিং) সিঙ্কে ছিল, তবে আপনি পুনরায় সেট করার পরে HEAD এবং সূচকটি সিঙ্কে তৈরি করেছেন।

git rmঅন্যদিকে কার্যনির্বাহী ডিরেক্টরি এবং সূচক থেকে একটি ফাইল সরিয়ে দেয় এবং আপনি যখন প্রতিশ্রুতিবদ্ধ হন তখন ফাইলটি গাছ থেকেও সরানো হয়। git rm --cachedতবে ফাইলটিকে কেবল সূচক থেকে সরিয়ে ফেলা হয় এবং এটি আপনার কার্যকরী অনুলিপিতে রাখে। এটি হ'ল বিপরীতে git add file এই ক্ষেত্রে, আপনি সূচককে প্রধান এবং কার্যকারিতা থেকে পৃথক করে তোলেন, এতে যে হেডের ফাইলের পূর্বে প্রতিশ্রুতিবদ্ধ সংস্করণ রয়েছে, ওয়ার্কিং অনুলিপিটি হ'ল হেডের কোনও বিষয়বস্তু বা লিখিত সামগ্রী থাকলে শেষ পরিবর্তন হয়েছিল working ফাইলটি এবং আপনি সূচি থেকে ফাইলটি সরিয়েছেন। একটি কমিট এখন সূচি এবং গাছ সিঙ্ক করবে এবং ফাইলটি সরানো হবে।


আমি যে পরে লক্ষ্য কমান্ড কোনো পরিবর্তন কিন্তু প্রদর্শন করা হয় না , যেমন যদি এটা এখনও ক্যাসে নিয়ে যাওয়া হয়, শো পরিবর্তন। তবে হচ্ছে ফাইল দেখায় । একরকম বেমানান বলে মনে হচ্ছে। git rm --cachedgit diffgit diff --cachedgit statusUntracked
হরিদসভ

7
কিছু মনে করবেন না ... আমার ব্যবহার করা উচিত ছিল git reset --mixedgit rm --cachedএর বিপরীত বক্তব্য শুনে আমি কিছুটা বিভ্রান্ত হয়ে পড়েছিলাম git add। আক্ষরিকভাবে নেওয়া, এটি ভুল এবং ক্ষতির কারণ হতে পারে। আমার ক্ষেত্রে, আমি git addস্টেজেজ এরিয়ায় একটি সংশোধিত ফাইল যুক্ত করতাম এবং ফাইলটির প্রাথমিক অ্যাডের চেয়ে "যে অ্যাড" এর বিপরীতটি চাইতাম। + গ্রেগ হিউগিলের উত্তর আমাকে আরও পরিষ্কার ছবি পেতে সহায়তা করেছে।
হরিদসভ

12
আমি কার্যকরী অনুলিপি, গাছ এবং কার্যকারী গাছের ব্যবহারটি একটু বিভ্রান্তির মধ্যে পেয়েছি। কাজের গাছটি কি ওয়ার্কিং কপি, বা গাছ?
নিলভ

3
@ হরিদস্ব যেমন উল্লেখ করেছেন, git rm --cached'এর ঠিক বিপরীত git add file' বলা বিভ্রান্তিমূলক। git reset fileএর বিপরীত হতে কাছাকাছি git add file
ম্যাট ব্রাউন

@ নিলেভ বিচলিত, তবে অন্যদের জন্য যারা এই থ্রেডটি খুঁজে পান: কার্যকরী অনুলিপি, গাছ এবং কার্যনির্বাহী গাছ সকলেই একই জিনিসকে বোঝায় (গিটের প্রসঙ্গে)।
দে নভো

83

সম্ভবত একটি উদাহরণ সাহায্য করবে:

git rm --cached asd
git commit -m "the file asd is gone from the repository"

বনাম

git reset HEAD -- asd
git commit -m "the file asd remains in the repository"

মনে রাখবেন যে আপনি যদি অন্য কিছু পরিবর্তন না করে থাকেন তবে দ্বিতীয় প্রতিশ্রুতি আসলে কিছুই করবে না।


3
আপনি কি আমাকে বলতে পারবেন যে ডাবল হাইফেন - হেডের পরে আসলে কী বোঝায়?
যুবা

30
@ ইউভা: --ফাইলের নাম থেকে কমান্ড বিকল্পগুলি পৃথক করতে ব্যবহৃত হয়। যদি একটি শাখা এবং নামের একটি ফাইল উভয়ই থাকত asdতবে git reset HEAD asdতা দ্বিধাগ্রস্থ হবে। --বলে "সবকিছু নিম্নলিখিত এই একটি ফাইলের নাম হয়"।
গ্রেগ হিউগিল

git reset HEAD <file>ঠিক ঠিক তেমনি কি git rm --cached <file>আর তখন git add --intent-to-add <file>?
অ্যালকোহল খারাপ 23

1
একটি বিশেষ ক্ষেত্রে বাদে @ এলকোহলসাইভিল নং no দেখুন এই চমৎকার, সংক্ষিপ্ত উত্তর।
দে নভো

45

git rm --cached fileহবে অপসারণ মঞ্চ থেকে ফাইল। অর্থাৎ, আপনি যখন প্রতিশ্রুতিবদ্ধ তখন ফাইলটি সরানো হবে। git reset HEAD -- fileমঞ্চ অঞ্চলে ফাইলটি কেবলমাত্র সেই রাজ্যে পুনরায় সেট করে দেবে যেখানে এটি হেডের প্রতিশ্রুতিতে ছিল, অর্থাৎ সর্বশেষ প্রত্যাবর্তনের পরে আপনি যে পরিবর্তন করেছেন তা পূর্বাবস্থায় ফিরিয়ে আনবে। যদি সেই পরিবর্তনটি নতুনভাবে ফাইল যুক্ত হয় তবে সেগুলি সমতুল্য হবে।


7
git rm --cached fileএর বিপরীতমুখী ধারণাটি (যেমন অন্যান্য উত্তরগুলিতে উল্লিখিত হয়েছে) এর সাথে মিল রেখে git add, এই উত্তরটি আমার কাছে প্রচুর অর্থবোধ করেছিল, এবং এটি বেশ সাবলীল ছিল। প্রায় এই মন্তব্য হিসাবে সংক্ষিপ্ত;)
rbatt

2
@ আরব্যাট ঠিক এখানে মন্তব্য করার জন্য এবং স্পষ্ট করে বলতে, git rm --cached fileএর বিপরীত নয়git add file । আচরণটি git add fileনির্দিষ্ট ক্ষেত্রে যেখানে আপনি একটি নতুন, পূর্বে অপরিশোধিত ফাইল যুক্ত করেছেন তার বিপরীতে দেখা যায়। অন্য প্রতিটি ক্ষেত্রে বিপরীত git add fileহয় git reset HEAD fileপ্রথম ক্ষেত্রেও git reset HEAD fileবিপরীত git add fileহয় (একটি চিহ্নবিহীন ফাইল যুক্ত করা) এবং প্রতিটি ক্ষেত্রেই তাই আপনি যদি গিট অ্যাডকে বিপরীত করতে চান তবে গিটটি যা করার পরামর্শ দেয়।
দে নভো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.