কীভাবে সামগ্রী মোছা না করে বিপুল সংখ্যক ফাইল আনস্টেজ করা যায়


454

আমি দুর্ঘটনাক্রমে ব্যবহার করে প্রচুর অস্থায়ী ফাইল যুক্ত করেছি git add -A

আমি নিম্নলিখিত কমান্ডগুলি ব্যবহার করে ফাইলগুলি আনস্টেজ করতে সক্ষম হয়েছি এবং নোংরা সূচকটি মুছে ফেলতে পরিচালিত করেছি।

git ls-files -z | xargs -0 rm -f
git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached

উপরের কমান্ডগুলি তালিকাভুক্ত করা হয়েছে git help rm। তবে দুঃখের বিষয়, আমার ফাইলগুলিও মৃত্যুদন্ড কার্যকর করার সময় মুছে ফেলা হয়েছিল, যদিও আমি ক্যাশে বিকল্প দিয়েছিলাম। বিষয়বস্তু না হারিয়ে আমি কীভাবে সূচকটি সাফ করতে পারি?

এছাড়াও যদি কেউ এই পাইপ অপারেশনটি কাজ করে সেভাবে ব্যাখ্যা করতে পারে তবে এটি সহায়ক হবে।


8
rm -fগিট কমান্ড নয় এবং এর কোনও --cachedবিকল্প নেই। আপনার স্থানীয় ফাইলগুলি কার্যকর git rmকরার আগে মুছে ফেলা হয়েছিল তাই আমি মনে করি না যে আপনি git rmকোনও কিছুর জন্য বৈধভাবে দোষ দিতে পারেন ।
সিবি বেইলি

8
@sarat থেকে অত্যন্ত সম্মত উত্তর নেই সঠিক উত্তর পরিবর্তন বিবেচনা করুন ইয়ান ম্যাডক্স , যেমন git reset --hardহয় সঠিক উত্তর না এবং সত্য সামগ্রীটি মুছে ফেলবে। এটি ব্যবহারকারীদের বিভ্রান্ত করবে - যেমনটি আমার মতো হয়েছিল।
মার্কো পশকভ

2
মার্কো যেমন বলেছে তেমন সর্ট, যাবেন। এই পৃষ্ঠাটি প্রচুর ট্র্যাফিক পায়।
রস

@ মার্কোপাশকভ এবং রস ধন্যবাদ ছেলেরা। সম্পন্ন.
sarat

উত্তর:


986

git reset

যদি আপনি যা চান তা হ'ল অতিমাত্রায় "গিট অ্যাড" রানটি পূর্বাবস্থায় ফেলা:

git reset

আপনার পরিবর্তনগুলি আনস্টেজ করা হবে এবং আপনি দয়া করে পুনরায় যুক্ত করার জন্য প্রস্তুত।


না চালান git reset --hard

এটি কেবলমাত্র আপনার যুক্ত হওয়া ফাইলগুলি আনস্টেজ করবে না, তবে আপনার কার্যক্ষম ডিরেক্টরিতে আপনি যে কোনও পরিবর্তন করেছেন তা ফিরিয়ে দেবে। আপনি যদি ওয়ার্কিং ডিরেক্টরিতে কোনও নতুন ফাইল তৈরি করেন তবে তা সেগুলি মুছবে না


15
আমি আপনাকে একটি পিন্ট ইয়ান
দেব

1
আমি প্রায়ই আমি সঞ্চালন আছে এটি git checkout -- *হিসাবে ভাল
den-জেসন

1
আপনি প্রচুর প্রচেষ্টা সাশ্রয় করেছেন। ধন্যবাদ মানুষ
রজনীকান্তডীক্ষিত

35

আপনার যদি কোনও প্রাচীন রেপো থাকে (বা শিরোনাম সেট করা নেই) [1] আপনি সহজভাবে করতে পারেন

rm .git/index

অবশ্যই, এই ফাইল পুনরায় যোগ করতে হবে যে আপনি হয়নি যোগ করা চাই।


[1] দ্রষ্টব্য (মন্তব্যে বর্ণিত হিসাবে) এটি কেবল তখনই ঘটে যখন রেপো একেবারে নতুন ("প্রাইসটাইন") হয় বা যদি কোনও চুক্তি না করা হয়। আরও প্রযুক্তিগতভাবে, যখনই কোনও চেকআউট বা ওয়ার্ক-ট্রি নেই।

এটি আরও পরিষ্কার করে দিচ্ছি :)


হ্যাঁ এটি তৈরি সূচকটি নিজেই মুছার মতো। ভাল জিনিস হ'ল, আমার গিটটি পুনরায় আরম্ভ করার দরকার নেই। ধন্যবাদ!
শরৎ

নিশ্চিত যে এটি নিরাপদ অপারেশন? আমি সবেমাত্র এটি করেছি (প্রকৃতপক্ষে সরানো সূচকটি বাইরে চলে গেছে) এবং অন্য সমস্ত ফাইল মুছে ফেলার জন্য মঞ্চস্থ হয়েছিল।
Inger

@ আঞ্জার "আপনার যদি একটি প্রাথমিক রেপো থাকে" আপনার স্পষ্টভাবে তা ছিল না।
সেপ্টেম্বর

আসলে, আমি ভাবছিলাম যে আপনি "প্রাইসটাইন রেপো" বলতে কী বোঝাতে চেয়েছিলেন (আমি গুগলের সাথে নিজেকে ভাগ্যবান মনে করি না) .. তাই আপনি আসলে একটি খালি রেপো বোঝাতে চেয়েছিলেন?
inger

1
@ আঞ্জার সম্মত। আমাকে ধরে নিতে হয়েছিল যে ওপিতে এই সঠিক পরিস্থিতিটি ঘটেছে - সে এটি নির্দিষ্ট করে না, তবে তার বিবরণটি সম্ভাবনাটি ছেড়ে দেয়। যাইহোক, আমি শুধু তথ্য ভাগ করছি, এবং ভোট দেওয়ার প্রভাবিত করতে পারবে না :( আছে উত্তর টেক্সট সতর্কতা একটি শব্দ যোগ ক্ষেত্রে এটি ভবিষ্যতে অন্যদের সাহায্য
sehe

15

git reset HEADফাইলগুলি অপসারণ না করে সূচি পুনরায় সেট করতে ব্যবহার করুন । (আপনি যদি কেবল সূচকটিতে কোনও নির্দিষ্ট ফাইল পুনরায় সেট করতে চান তবে আপনি এটি করতে ব্যবহার করতে পারেন git reset HEAD -- /path/to/file))

পাইপ অপারেটর, একটি শেলতে, stdoutপ্রক্রিয়াটি বাম দিকে নেয় এবং stdinডানদিকের প্রক্রিয়া হিসাবে এটি পাস করে । এটি মূলত এর সমতুল্য:

$ proc1 > proc1.out
$ proc2 < proc1.out
$ rm proc1.out

তবে এটির পরিবর্তে $ proc1 | proc2, দ্বিতীয় প্রক্রিয়াটি প্রথমে আউটপুট তৈরি করার আগে ডেটা পাওয়া শুরু করতে পারে, এবং এর সাথে কোনও আসল ফাইল নেই।


তবে একাধিক ফাইল সহ এটি কীভাবে ব্যবহার করবেন। আমি আগে কখনও এই ফাইলগুলি কমিট করি নি।
শরৎ

3
git reset HEADঅন্য কিছু নির্দিষ্ট না করে কেবল টাইপ করুন এবং এটি পুরো সূচিটি পুনরায় সেট করবে। তারপরে আপনি কেবল নিজের পছন্দ মতো ফাইলগুলি পুনরায় যুক্ত করতে পারেন।
অ্যাম্বার

আমি নিম্নলিখিত ত্রুটি পেয়েছি। আমি এই আইটেম আগে কখনও প্রতিশ্রুতিবদ্ধ না। $ git reset HEAD fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree. Use '--' to separate paths from revisions
শরৎ

1
git resetছাড়া, চেষ্টা করুন HEAD
অ্যাম্বার

আমি ইতিমধ্যে চেষ্টা করেছি যে আমি নিম্নলিখিত ত্রুটিটি শেষ করেছিলাম। $ git reset fatal: Failed to resolve 'HEAD' as a valid ref.
শরৎ

9
git stash && git stash pop

2
আমি 'গিট স্ট্যাশ && গিট স্ট্যাশ পপ' করব যাতে স্ট্যাশও মুছে যায়। 'প্রয়োগ' স্ট্যাশ তালিকায় স্ট্যাশ রেখে যাবে।
চিত্তি

8

যদি হেড সেট না করা থাকে (যেমন, আপনার এখনও কোনও কমিট নেই তবে আপনি কেবল উড়িয়ে দিতে চান না .gitকারণ আপনি ইতিমধ্যে রেখে যেতে চাইছেন এমন অন্য রেপো কনফিগারেশন সেটআপ করেছেন), আপনি এটি করতেও পারেন

git rm -rf --cached .

সমস্ত কিছু আনস্টেজ করতে। এটি কার্যকরভাবে সেহের সমাধান হিসাবে একই, তবে গিট ইন্টারনালদের সাথে মাতামাতি এড়ানো যায় না।


এটি আসলে গিটকে ক্যাশেড অঞ্চলের সমস্ত কিছু মুছে ফেলতে বলে।
ভিশনারি সফটওয়্যার সলিউশন

1
ক্যাশেটি মঞ্চ অঞ্চল হিসাবেও পরিচিত, তাই আপনি কী পাচ্ছেন তা আমি নিশ্চিত নই।
jjlin

সেহ থেকে, আরএম .git / সূচকটি অত্যন্ত বিপজ্জনক - একটি ব্র্যান্ড নিউ রেপো সম্পর্কে তার যে নোটটি রয়েছে তা অবশ্যই পড়ুন! অন্যান্য 99.999% সময়ের জন্য এটি অনেক বেশি নিরাপদ। আমি মনোযোগ দিয়ে পড়িনি এবং আমার ওয়ার্কিং কপির উপর আরএম .git / ইনডেক্স করার পরে আমার ওয়ার্কিং কপিটি ফেলে দিয়ে পুনরায় ক্লোন করতে হয়েছিল।
পিএইচপিগুরু

এই আদেশ ব্যবহার করবেন না! এটি সমস্ত প্রকল্পকে নিয়ন্ত্রণহীন অবস্থায় (মঞ্চস্থ হয়নি এমনগুলি সহ) পরিবর্তন করবে। এটি মূল প্রশ্নের সমাধান নয়। 'গিট আরএম' কমান্ডটি ব্যবহার করে সঠিক সমাধানটি কেবলমাত্র আপনার ফাইলগুলিকে স্টেস্ট না করা নির্দিষ্ট করা তা কেবলমাত্র: git rm -rf --cached <ফাইলগুলি আপনি আনস্টেজ করতে চান>।
মন্টি ক্রেজার

আপনার কেবল তখনই এই কমান্ডটি ব্যবহার করা উচিত যখন আপনার কাছে এখনও কোনও কমিটস ছাড়াই একটি নতুন রেপো নেই (এটি "হেড সেট করা নেই" এর অর্থ) তবে আপনি কেবল উড়ে যেতে চান না .gitকারণ আপনি অন্য রেপো কনফিগারেশন সেট আপ করেছেন you রাখতে চাই আমি এটি স্পষ্ট করতে সম্পাদনা করেছি।
jjlin

5

সতর্কতা: আপনি অনির্দিষ্ট কাজটি হারাতে না চাইলে নিম্নলিখিত কমান্ডটি ব্যবহার করবেন না!

ব্যবহারের git resetব্যাখ্যা দেওয়া হয়েছে, তবে আপনি পাইপযুক্ত কমান্ডগুলির ব্যাখ্যাও চেয়েছিলেন, তাই এখানে যায়:

git ls-files -z | xargs -0 rm -f
git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached

কমান্ডটি git ls-filesসমস্ত ফাইলকে তালিকাবদ্ধ করে যা গিট সম্পর্কে জানে। বিকল্পটি -zতাদের উপর একটি নির্দিষ্ট ফর্ম্যাট চাপিয়ে দেয়, প্রত্যাশিত ফর্ম্যাটটি xargs -0যা তারপরে অনুরোধ rm -fকরে, যার অর্থ আপনার অনুমোদনের জন্য পরীক্ষা না করে এগুলি সরিয়ে দেওয়া।

অন্য কথায়, "আপনার স্থানীয় অনুলিপি সম্পর্কে সমস্ত ফাইলের গিট জেনে তালিকাবদ্ধ করে তা মুছে ফেলুন"।

তারপরে আমরা যাব git diff, যা গিট সম্পর্কে জেনে থাকা আইটেমগুলির বিভিন্ন সংস্করণের মধ্যে পরিবর্তন দেখায়। এগুলি বিভিন্ন গাছের মধ্যে পরিবর্তন হতে পারে, স্থানীয় অনুলিপি এবং দূরবর্তী অনুলিপিগুলির মধ্যে পার্থক্য ইত্যাদি।
এখানে ব্যবহৃত হিসাবে, এটি অপ্রচলিত পরিবর্তনগুলি দেখায়; ফাইলগুলি আপনি পরিবর্তন করেছেন তবে প্রতিশ্রুতিবদ্ধ হন নি। বিকল্পটির --name-onlyঅর্থ আপনি কেবলমাত্র (পূর্ণ) ফাইলের নাম চান এবং এর --diff-filter=Dঅর্থ আপনি কেবল মুছে ফেলা ফাইলগুলিতে আগ্রহী। (আরে, আমরা কি কেবল একগুচ্ছ জিনিস মুছতে পারি নি?) এরপরে xargs -0আমরা এর আগে যেটা দেখেছি তাতে পাইপ দেওয়া হয় , যা git rm --cachedতাদের ডাকে , মানে তারা ক্যাশে থেকে সরে যায়, যখন কাজের গাছটি একা ছেড়ে যায় should আপনি সবেমাত্র আপনার কার্যকারী গাছ থেকে সমস্ত ফাইল সরিয়ে দিয়েছেন। এখন সেগুলি আপনার সূচি থেকেও সরানো হয়েছে।

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


টিএল; ডিআর: আপনি সব কিছুকে হজ করেছেন; আবার শুরু করুন এবং git resetএখন থেকে ব্যবহার করুন।


2

আমি ভীত যে এই কমান্ড লাইনগুলির মধ্যে প্রথমটি গিটারের মঞ্চে থাকা সমস্ত ফাইল যা ওয়ার্কিং কপি থেকে নিঃশর্তভাবে মুছে ফেলা হয়েছে। দ্বিতীয়টি ট্র্যাক করা সমস্ত ফাইল আনস্টেজ করা থাকলেও এখন মুছে ফেলা হয়েছে। দুর্ভাগ্যক্রমে এর অর্থ হ'ল আপনি সেই ফাইলগুলিতে কোনও আপত্তিহীন পরিবর্তন হারাবেন।

আপনি যদি আপনার কার্যকরী অনুলিপি এবং শেষ প্রতিশ্রুতি অনুসারে কীভাবে সূচক পেতে চান তবে আপনি নীচের কমান্ডটি ( সাবধানতার সাথে ) ব্যবহার করতে পারেন :

git reset --hard

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

আপডেট: এটি অ্যাম্বারের উত্তরে আপনার মন্তব্য থেকে শোনা যাচ্ছে যে আপনি এখনও কোনও প্রতিশ্রুতি তৈরি করেন নি (যেহেতু শিরোনাম সমাধান করা যায় না) সুতরাং এটি সাহায্য করবে না, আমি ভয় করি।

সেই পাইপগুলি কীভাবে কাজ করে: git ls-files -zএবং git diff --name-only --diff-filter=D -zউভয়ই বাইটের সাথে পৃথক করা ফাইলের নামের একটি তালিকা আউটপুট দেয় 0। (এই উপযোগী, যেহেতু নতুন লাইন অসদৃশ হয় 0বাইট উপর সিস্টেম ইউনিক্স-সদৃশ ফাইলের নামের ঘটতে না নিশ্চিত করা হয়।) প্রোগ্রাম xargsমূলত স্ট্যান্ডার্ড ইনপুট থেকে লাইন গ্রহণ এবং তাদের শেষ যুক্ত করে, তার মান ইনপুট থেকে কমান্ড লাইন তৈরী করে ডিফল্টরূপে কমান্ড লাইনের। -0বিকল্প দ্বারা দ্বারা পৃথক মান ইনপুট আশা বলেছেন 0বাইট। xargsকমান্ড লাইন কখনই বেশি দীর্ঘ হয় না তা নিশ্চিত করে স্ট্যান্ডার্ড ইনপুট থেকে সমস্ত পরামিতি ব্যবহার করতে কমান্ডটি কয়েকবার আবেদন করতে পারে।

একটি সাধারণ উদাহরণ হিসাবে, যদি test.txtনিম্নলিখিত ফাইলগুলির সাথে আপনার কাছে একটি ফাইল বলা হয় :

hello
goodbye
hello again

... তাহলে কমান্ডটি আদেশটি শুরু xargs echo whatever < test.txtকরবে:

echo whatever hello goodbye hello again

আমি কখনই কোনও প্রতিশ্রুতি করি নি তাই এটি বলবে যে হেডকে সমাধান করতে পারে না। এ জাতীয় পরিস্থিতিতে আমরা কী করি। পাইপটি বিশদভাবে ব্যাখ্যা করার জন্য অনেক ধন্যবাদ।
শরৎ

8
যদি আপনি কেবল নিজের গিট উপেক্ষা করে পরিবর্তন করেছেন এবং প্রচুর ফাইল অন্তর্ভুক্ত করার জন্য গিট যুক্ত করেছেন - তবে গিরি পুনরায় সেট করবেন না - এগুলি স্টেস্টেজ করার জন্য। তারা মুছে ফেলা হবে !!
অজয়

5
Uwaaahh !! হতে পারে আপনার "সাবধানে" শব্দটি হাইলাইট করতে হবে । আমি কেবল এই তিনটি শব্দ "গিট রিসেট --হार्ड" দেখেছি এবং আমার সমস্ত অচিহ্নবদ্ধ ফাইলগুলি ... ফুফফ !! সর্বস্বান্ত!!!!!
ভিনিথ চিত্তেটি

1

আপনি যদি নীচের কমান্ডটি ব্যবহার করে সমস্ত পরিবর্তন আনস্টেজ করতে চান,

git reset --soft HEAD

আপনি যদি পরিবর্তনগুলি আনস্টেজ করতে চান এবং সেগুলি কার্য ডিরেক্টরি থেকে ফিরিয়ে দিতে চান,

git reset --hard HEAD
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.